HTTPS in nginx einrichten

HTTPS in nginx einrichten

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:

HTTPS mit Nginx

2 Gedanken zu „HTTPS in nginx einrichten“

  1. Habs versucht damit einzurichten. Genauso gemacht, allerdings wird mein Zertifikat als „Nicht-Sicher“ gekennzeichnet… obwohl ichs ganz genauso gemacht habe

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert