EC2+nginx+django+gunicorn+letsencrypt ssl -> ZEITÜBERSCHREITUNG

EC2+nginx+django+gunicorn+letsencrypt ssl -> ZEITÜBERSCHREITUNG

Ich kämpfe jetzt schon seit ein paar Stunden und habe mir viele ähnliche Fragen auf SE angesehen. Ich konnte mein Problem jedoch nicht beheben.

Um die offensichtlichen Fragen zu beantworten:

  • Auf meiner ec2 (ubuntu)-Instanz läuft keine Firewall
  • Der Port 443 ist für ein- und ausgehende Nachrichten geöffnet.
  • SSL-Dateien erstellt mitsudo certbot certonly --standalone
  • unverschlüsselte Anfragen funktionieren einwandfrei
  • Ich habe den A-Record meiner Domain so eingerichtet, dass er auf den öffentlichen DNS meiner EC2-Instanz verweist. Es gibt jedoch keine Optionen für Namespace-Records.
  • Ja, ich bin ein Idiot

Ich habe die Datei nginx.conf nicht verändert, außer Folgendes hinzuzufügen:

include /etc/nginx/sites-enabled/*;

Meine nginx-conf in /etc/nginx/sites-available/myapp.conf (mit symbolischem Link in …/sites-enabled/myapp.conf):

server {
        listen 80;
        listen 443 default ssl;   

        ssl_certificate /etc/letsencrypt/live/mydomain/fullchain.pem;
        ssl_certificate_key /etc/letsencrypt/live/mydomain/privkey.pem;

        server_name mydomain;

        location /static/ {
                autoindex on;
                alias /home/ubuntu/MYAPP/static/;
        }

        location /data/ {
                autoindex off;
                alias /home/ubuntu/MYAPP/data/;
        }

        location / {
                include proxy_params;
                proxy_pass http://unix:/home/ubuntu/MYAPP/app.sock;
        }
}

In den „settings.py“ meiner APPS habe ich Folgendes hinzugefügt:

ALLOWED_HOSTS = [
  'localhost',
  '127.0.0.1',
  'mywebsite.com']

Im Moment habe ich Folgendes auskommentiert

#SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTO', 'https')
#SECURE_SSL_REDIRECT = True
#SESSION_COOKIE_SECURE = True
#CSRF_COOKIE_SECURE = True

Ausgabe nc -vz localhost 443gibtConnection to localhost 443 port [tcp/https] succeeded!

netstat -ntlpgibt

(Not all processes could be identified, non-owned process info
 will not be shown, you would have to be root to see it all.)
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name    
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      -                   
tcp        0      0 127.0.0.53:53           0.0.0.0:*               LISTEN      -                   
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      -                   
tcp        0      0 0.0.0.0:443             0.0.0.0:*               LISTEN      -                   
tcp6       0      0 :::22                   :::*                    LISTEN      -   

Allerdings curl -v localhost:443führt

*   Trying 127.0.0.1:443...
* Connected to localhost (127.0.0.1) port 443 (#0)
> GET / HTTP/1.1
> Host: localhost:443
> User-Agent: curl/7.71.1
> Accept: */*
> 
* Mark bundle as not supporting multiuse
< HTTP/1.1 400 Bad Request
< Server: nginx/1.18.0 (Ubuntu)
< Date: Fri, 08 Jan 2021 15:14:04 GMT
< Content-Type: text/html
< Content-Length: 264
< Connection: close
< 
<html>
<head><title>400 The plain HTTP request was sent to HTTPS port</title></head>
<body>
<center><h1>400 Bad Request</h1></center>
<center>The plain HTTP request was sent to HTTPS port</center>
<hr><center>nginx/1.18.0 (Ubuntu)</center>
</body>
</html>
* Closing connection 0

Und der Versuch, über https://... auf meine Domain zuzugreifen, führt zu einem Timeout.

EDIT: Wie Steffen bemerkt, war mein Curl-Befehl falsch. Hier ist der richtige

curl -v https://localhost:443

was zu

*   Trying 127.0.0.1:443...
* Connected to localhost (127.0.0.1) port 443 (#0)
* ALPN, offering http/1.1
* successfully set certificate verify locations:
*   CAfile: /home/ubuntu/anaconda3/ssl/cacert.pem
  CApath: none
* TLSv1.3 (OUT), TLS handshake, Client hello (1):
* TLSv1.3 (IN), TLS handshake, Server hello (2):
* TLSv1.3 (IN), TLS handshake, Encrypted Extensions (8):
* TLSv1.3 (IN), TLS handshake, Certificate (11):
* TLSv1.3 (IN), TLS handshake, CERT verify (15):
* TLSv1.3 (IN), TLS handshake, Finished (20):
* TLSv1.3 (OUT), TLS change cipher, Change cipher spec (1):
* TLSv1.3 (OUT), TLS handshake, Finished (20):
* SSL connection using TLSv1.3 / TLS_AES_256_GCM_SHA384
* ALPN, server accepted to use http/1.1
* Server certificate:
*  subject: CN=mydomain.com
*  start date: Jan  8 10:37:06 2021 GMT
*  expire date: Apr  8 10:37:06 2021 GMT
*  subjectAltName does not match localhost
* SSL: no alternative certificate subject name matches target host name 'localhost'
* Closing connection 0
* TLSv1.3 (OUT), TLS alert, close notify (256):
curl: (60) SSL: no alternative certificate subject name matches target host name 'localhost'
More details here: https://curl.haxx.se/docs/sslcerts.html

curl failed to verify the legitimacy of the server and therefore could not
establish a secure connection to it. To learn more about this situation and
how to fix it, please visit the web page mentioned above.

Jetzt zeigt /var/log/nginx/error.log keine Fehler an.

/var/log/nginx/access.log 

zeigt keine Anfrage an, wenn ich versuche, es über https in meinem Browser zu öffnen. Bei nur http werden die Anfragen protokolliert. Es scheint also, als ob die Anfrage nicht einmal bei nginx ankommt, oder?

Ich habe noch nie zuvor Nginx (oder irgendetwas Server-/Backend-bezogenes) verwendet und habe absolut keine Ahnung.

EDIT2: Brauche ich eine elastische IP, damit das funktioniert? Irgendwelche Vorschläge?

verwandte Informationen