SSL-Zertifikate müssen für die Verwendung von sicheren HTTPS-Verbindungen erstellt und im Webserver konfiguriert werden. Nur damit ist der Verkehr zwischen Server und Client abhörsicher. Die Einrichtung in Nginx ist dabei relativ simpel und schnell umgesetzt. Wie und wo ein kostenloses und akzeptiertes SSL-Zertifikat erstellt werden kann, erfährst du in SSL-Zertifikat mit Let’s Encrypt erstellen. Wie Nginx installiert und konfiguriert wird, habe ich in diesem Artikel beschrieben.
Konfiguration von SSL-Zertifikaten in Nginx
Für die Konfiguration von SSL-Zertifikaten in Nginx sind die markierten Zeilen wichtig.
server { listen 80; # hört auf Port 80 / HTTP Verkehr listen 443 ssl; # hört auf Port 443 und verwendet SSL/TLS für HTTPS root /usr/share/nginx/html; # Web-Stammverzeichnis mit HTML und PHP-Dateien index index.html index.htm index.php; server_name domain.de; # Domain für die Nginx mit dieser Anweisung antwortet ssl_certificate /etc/nginx/ssl/fullchain.pem; # Pfad zu Chained-Zertifikat ssl_certificate_key /etc/nginx/ssl/privkey.pem; # Pfad zum privaten Schlüssel location / { try_files $uri $uri/ =404; } }
In diesem Beispiel hört der Webserver auf Port 80 (HTTP) und 443 (HTTPS). ssl
gibt bei listen 443 ssl;
an, dass SSL/TLS (also HTTPS) verwendet werden soll. Bei ssl_certificate
wird das signierte Zertifikat mit Zertifizierungskette hinterlegt, also der Certificate Chain inkl. Intermediate Zertifikat. Mit ssl_certificate_key
wird der private Schlüssel hinterlegt um die Verbindungen zu entschlüsseln.
Als Protokoll verwendet Nginx standardmäßig TLSv1 TLSv1.1 TLSv1.2
, für die Ciphersuites HIGH:!aNULL:!MD5
. Über die Anweisungen ssl_protocols TLSv1.2,...
und ssl_ciphers HIGH:MEDIUM:!aNULL...
kann das angepasst werden.
Weitere hilfreiche Informationen zur Konfiguration liefert Nginx in einem eigenen Artikel. Das Mozilla Projekt nennt außerdem weitere, empfohlene Einstellungen um die die Sicherheit erhöhen.
Der Webserver kann anschließend über Webtools wie https://de.ssl-tools.net/webservers oder https://www.ssllabs.com/ssltest/ getestet werden.
Weiterleitung von HTTP zu HTTPS
Neben der zusätzlichen Konfiguration von HTTPS macht es Sinn, sämtlichen HTTP-Verkehr anzunehmen und an eine HTTPS-Verbindung zu übergeben (mit obereren Implementierung ersetzen!). Damit werden ausschließlich SSL/TLS-gesicherte HTTPS-Verbindungen vom Webserver bearbeitet.
server { listen 80; server_name domain.de; return 301 https://$server_name$request_uri; # Dauerhafte Weiterleitung mit 301 Statuscode } server { listen 443 ssl; # hört auf Port 443 und verwendet SSL/TLS für HTTPS root /usr/share/nginx/html; # Web-Stammverzeichnis mit HTML und PHP-Dateien index index.html index.htm index.php; server_name domain.de; # Domain für die Nginx mit dieser Anweisung antwortet ssl_certificate /etc/nginx/ssl/fullchain.pem; # Pfad zu Chained-Zertifikat ssl_certificate_key /etc/nginx/ssl/privkey.pem; # Pfad zum privaten Schlüssel location / { try_files $uri $uri/ =404; } }
Hi,
danke für ihre wertvolle Informationen. Jetzt habe ich es endlich geschafft, vernünftig von HTTP zu HTTPS umzuleiten.
Grüße
Dennis