HTTPS mit Let’s Encrypt und Nginx

Let's Encrypt Zertifikat

Let’s Encrypt bietet kostenlose und einfach einzurichtende SSL Zertifikate, die dennoch von den gängigen Browsern akzeptiert werden. Lediglich sehr alte Android Versionen, Windows XP und einige andere wenig genutzte Betriebssysteme verweigern diese Zertifikate. In diesem Artikel zeige ich wie man das Ganze mit Nginx unter Debian und Ubuntu einrichtet.

Let’s Encrypt Einrichten

Bitte beachte, dass die hier benutzte Domain meinedomain.de stets durch die eigene Domain ersetzt werden muss. Der sudo Befehl ist bei einigen Befehlen notwendig, wird hier aber nicht mit angegeben.

Client installieren

Zunächst müssen wir den Let’s Encrypt Client von deren Github Seite runterladen. Falls noch nicht geschehen müssen wir dafür erstmal Git installieren:

aptitude install git
git clone https://github.com/letsencrypt/letsencrypt
cd letsencrypt

Zertifikat Anfordern

Um gegenüber Let’s Encrypt zu bestätigen, dass wir im Besitz unserer Domain sind müssen wir als nächstes die Domain über den Client autorisieren. Dafür gibt es zwei Möglichkeiten:

Option 1:
Läuft bereits ein Nginx Server mit einer fertig konfigurierten Seite kann das Erstellen des Zertifikats mit einem einzigen Befehl erfolgen. Diese Option ist zu bevorzugen, da wir den Nginx Server nicht stoppen müssen:

./letsencrypt-auto certonly --webroot -w /var/www/meinedomain -d meinedomain.de -d www.meinedomain.de

Der hinter -w angegebene Pfad muss der in Nginx konfigurierte Root-Pfad der hinter -d angegebene Domain sein. Nginx muss während der Ausführung des Befehls laufen. Es wird dabei eine Datei im Root-Verzeichnis erstellt, die von den Let’s Encrypt Servern überprüft wird, um uns zu autorisieren.

Option 2:
Ist der Nginx Server noch nicht fertig konfiguriert, müssen wir zunächst den Nginx Server stoppen um Port 80 freizugeben. Der Client öffnet dann einen eigenen temporären Webserver, um sich gegenüber den Let’s Encrypt Servern zu autorisieren:

nginx stop
./letsencrypt-auto certonly -d meinedomain.de -d www.meinedomain.de
nginx start

Wird das letsencrypt-auto Programm zum ersten Mal ausgeführt, dauert das Ganze ein bisschen länger, da zunächst einige Packages installiert werden, die der Client benötigt.

Wir werden aufgefordert unsere Email-Adresse einzugeben. Diese wird für dringende Nachrichten benutzt und für „lost key recovery“. Was genau damit gemeint ist konnte ich leider nicht herausfinden. Hierbei kann aber nicht der Private Key gemeint sein, da dieser durch dem Client erzeugt wird und sich somit nicht von den Let’s Encrypt Servern wiederherstellen lässt.

Egal welche Option gewählt wurde, nach erfolgreicher Fertigstellung des Befehls landet unser Zertifikat, sowie der Public und der Private Key im Verzeichnis /etc/letsencrypt/live/meinedomain.de und es sollte die folgende Meldung erscheinen:

Let's Encrypt Erfolg

Nginx Konfigurieren

Nachdem wir nun unsere Keys haben, müssen wir nur noch Nginx anweisen diese zu benutzen. Wir fügen dazu der Konfigurationsdatei der entsprechenden Seite folgende Zeilen hinzu:

listen 443 ssl;
ssl_certificate /etc/letsencrypt/live/meinedomain.de/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/meinedomain.de/privkey.pem;

Falls unser Server eine Firewall benutzt, muss noch Port 443 freigeschaltet werden. Bei UFW würde dies beispielsweise über folgenden Befehl gehen:

ufw allow 443/tcp

Anschließen starten wir Nginx neu:

service nginx restart

Hat alles geklappt ist unsere Seite jetzt sowohl über http:// als auch über https:// erreichbar.

HTTPS Only

Falls wir möchten, dass unsere Seite ausschließlich verschlüsselt erreichbar ist, müssen wir unserer Nginx Konfigurationsdatei einen weiteren Server-Block hinzufügen, der sämtliche HTTP Anforderungen auf HTTPS umleitet. Eine beispielhafte Nginx-Datei könnte dann so aussehen:

server {
    listen 80;
    server_name meinedomain.de;
    return 301 https://$server_name$request_uri;
}

server {
    listen 443 default_server ssl;
    server_name meinedomain.de;

    ssl_certificate /etc/letsencrypt/live/meinedomain.de/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/meinedomain.de/privkey.pem;

    root /var/www/meinedomain;
    index index.html;
}

Verfallsdatum Beachten

Zertifikate haben nur eine bestimmte Lebensdauer. Dies ist sinnvoll, damit der Private Key nicht bis in alle Ewigkeit für Man-in-the-Middle Angriffe zu gebrauchen ist, falls er in falsche Hände gerät. Erst kürzlich verkündete beispielsweise Microsoft, dass deren Private Key für die Seite *.xboxlive.com versehentlich offengelegt wurde. Da dieses Zertifikat noch bis Ende 2017 gültig ist, kann sich bis dahin theoretisch jeder als Inhaber der Seite ausgeben. Es gibt zwar Möglichkeiten ein Zertifikat zurückzuziehen, aber diese Methode ist unzuverlässig und lässt sich leicht umgehen.

Let’s Encrypt verwendet dagegen eine löbliche Lebensdauer von lediglich 90 Tagen. Das ist gut für die Sicherheit, heißt aber auch, dass wir das Zertifikat regelmäßig erneuern müssen. Glücklicherweise können wir dies über den Let’s Encrypt Client mit einem Cronjob automatisieren. Dazu benutzen wir den Befehl:

crontab -e

und fügen unten folgende Zeile ein:

@monthly /pfad/zu/letsencrypt-auto --agree-tos --renew certonly --webroot -w /var/www/meinedomain.de -d meinedomain.de -d www.meinedomain.de && service nginx restart

Damit wird unser Zertifikat jetzt automatisch jeden Monat erneuert, womit wir den 90 Tagen deutlich zuvorkommen. Um das Ganze zu testen können wir den selben Befehl einmal ausführen (ohne das @monthly) und unsere Seite aufrufen. In Chrome beispielsweise können wir uns die Uhrzeit anzeigen lassen, zu der ein Zertifikat ausgestellt wurde (bzw. zu der es abläuft): Neben der URL-Leiste auf das Schloss klicken > Verbindung > Zertifikatsinformationen. Die angezeigte Uhrzeit können wir mit der Uhrzeit vergleichen zu der wir den Befehl ausgeführt haben.

Let's Encrypt Zertifikat

Kommentare