Mit HTTPS und dem Protokoll TLS kann eine sichere Kommunikation zwischen Webserver (z. B. nginx) und einem Client (Browser) erzielt werden. Das schützt – heute mehr denn je – eine Verbindung vor Abhören oder Veränderung, z. B. durch einen Man-in-the-Middle-Angriff.
In dieser Anleitung wird die Einrichtung mit einem selbst-signierten Zertifikat vorgenommen und sollte daher nur im privaten/nicht-produktiven Umfeld angewandt werden. Für öffentliche oder produktive Zwecke auf Zertifikate einer vertrauenswürdigen, öffentlichen Zertifizierungsstelle zurückgreifen!
SSL-Zertifikat mit OpenSSL erstellen
Basis der sicheren Kommunikation sind Zertifikate, die im ersten Schritt auch erstellt werden müssen.
sudo mkdir /etc/nginx/ssl sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/nginx/ssl/nginx.key -out /etc/nginx/ssl/nginx.crt
openssl: Tool um Zertifikate und Schlüssel zu verwalten und generieren.
req: Beschreibt ein X.509 certificate signing request für das Public Key Verfahren.
-x509: Gibt an, statt eines CSR gleich ein selbstsigniertes Zertifikat auszustellen.
-nodes: Zertifikat wird nicht über ein Kennwort geschützt. Damit kann nginx ohne weitere Aktion (Eingabe des Kennworts) gestartet werden.
-days 365: Beschreibt die Gültigkeit des Zertifikates für 365 Tage
-newkey rsa:2048: Generiert das Zertifikat und einen 2048-bit langen RSA Schlüssel.
-keyout: Gibt die Ausgabepfad und -datei für den Schlüssel an.
-out: Gibt die Ausgabepfad und -datei des Zertifikates an.
Bei Einrichtung des Zertifikates werden verschiedene Daten zum Aussteller abgefragt. Besonderes wichtig ist der Common Name. Dieser sollte dem Hostname (z. B. raspberrypi) oder dem FQDN (z. B. meinpi.de) entsprechen.
Country Name (2 letter code) [AU]:DE State or Province Name (full name) [Some-State]:NRW Locality Name (eg, city) []:Köln Organization Name (eg, company) [Internet Widgits Pty Ltd]:privat Organizational Unit Name (eg, section) []: Common Name (e.g. server FQDN or YOUR name) []:hostname oder domain Email Address []:admin@mail.de
Sichern des Verzeichnisses und der Dateien:
chmod 0600 /etc/nginx/ssl/*
HTTPS in nginx einrichten
Nun sind die Zertifikate zur Verwendung im Nginx Konfigurationsverzeichnis hinterlegt.
Die Serveranweisungen der /etc/nginx/sites-available/default Datei sollten zur sicheren Verwendung von HTTPS in etwa so aussehen:
server { listen 80; listen [::]:80; server_name domain.de; return 301 https://$server_name$request_uri; } server { listen 443 ssl; listen [::]:443 ssl; server_name domain.de; root /usr/share/nginx/; index index.html index.htm; ssl_certificate /etc/nginx/ssl/nginx.crt; # fügt Zertifikat hinzu ssl_certificate_key /etc/nginx/ssl/nginx.key; # fügt privaten Schlüssel hinzu ssl_protocols TLSv1 TLSv1.1 TLSv1.2; # definiert die Protokolle ssl_ciphers HIGH:!aNULL:!MD5; # definiert die Ciphersuites location / { try_files $uri $uri/ =404; } ... }
Der erste Block gibt die Anweisung, alle Anfragen auf Port 80 an https://… weiterzuleiten. Block zwei, der auf Port 443 hört, stellt die SSL/TLS Verbindung via HTTPS her.
Das sind alle Einstellungen die in Nginx vorgenommen werden. Abschließend muss nur der Service neugestartet werden.
sudo service nginx restart
Überprüfen der HTTPS Verbindung
Nun müssen alle Anfragen an http://domain.de direkt zu https://domain.de umgeleitet werden. Beim ersten Aufruf erscheint im Browser eine Sicherheitsmeldung, dass dem Zertifikat nicht vertraut wird. Dieser muss vertraut werden, da es selbstsigniert ist und nicht über den Zertifikatsspeicher (z. B. über die Stammzertifizierungsstellen in Windows) vertrauenswürdig scheint. Wird dem Zertifikat durch Importieren in den Windows Zertifikatsspeicher vertraut, sieht das im Browser so aus:
Habs versucht damit einzurichten. Genauso gemacht, allerdings wird mein Zertifikat als „Nicht-Sicher“ gekennzeichnet… obwohl ichs ganz genauso gemacht habe
Hallo Reudiga,
schau dir das Zertifikat mal an. Ist die Kette vorhanden und vertraut dein System/Browser dem Stamm-Zertifikat?