Nginx mit Let’s Encrypt – Zertfikate nutzen

Bei Let’s Encrypt handelt es sich um eine Stammzertifizierungsstelle welche kostenlose SSL-Zertifikate ausstellt. Mit Hilfe des Let’s Encrypt Clients können Zertifikate (automatisiert) ausgestellt werden. Die Zertifikate sind grundsätzlich nur 90 Tage gültig. Durch die Automatisierungsmöglichkeiten ist das aber kein K.O Kriterium. Als Betriebssystem kommt Ubuntu 16.04.1 LTS zum Einsatz. Als Webserver wird nicht Apache sondern der recht bebliebte Nginx genutzt.

Herunterladen des Let’s Encrypt Clients
Die Installation ist via git schnell erledigt.

sudo apt-get update
sudo apt-get install git -y
sudo git clone https://github.com/certbot/certbot /opt/letsencrypt

Die notwendigen Abhängigkeiten bzw. fehlenden Paketen werden bei der ersten Ausführung des Clients nachinstalliert.

Erweiterung der nginx Konfiguration
Der Let’s Encrypt Clients erstellt für die Verifizierung der Webseitenadresse eine temporäre Datei. Dazu wird zuerst eine neues Verzeichnis angelegt:

cd /var/www
mkdir letsencrypt
chgrp www-data letsencrypt

Im Anschluss muss die entsprechende nginx – Konfigurationsdatei erweitert werden:

server {
    listen 80 default_server;
    server_name webserver01.lab01.wydler.eu;

    ...
    location /.well-known/acme-challenge {
        root /var/www/letsencrypt;
    }
    ...
}

Falls eine permanten Weiterleitung auf SSL konfiguriert ist, muss in diesem Abschnitt die Ergänzung durchgeführt werden.

Zum Schluss den Webserver nginx neustarten:

service nginx configtest
service nginx restart

Konfigurationsdatei für den Let’s Encrypt Client
Wie bei Linux üblich werden die Konfigurationsdateien unter /etc/ angelegt. Daher legen wir erstmal die Verzeichnisstruktur an.

mkdir /etc/letsencrypt
mkdir /etc/letsencrypt/configs/

Anschließend wird für jede Webseite eine separate Konfiguration angelegt.

vi /etc/letsencrypt/configs/webserver01.lab01.wydler.eu.conf

Inhalt:

# the domain we want to get the cert for;
# technically it's possible to have multiple of this lines, but it only worked
# with one domain for me, another one only got one cert, so I would recommend
# separate config files per domain.
domains = webserver01.lab01.wydler.eu


# increase key size
rsa-key-size = 4096

# the current closed beta (as of 2015-Nov-07) is using this server
server = https://acme-v01.api.letsencrypt.org/directory

# this address will receive renewal reminders
email = meineadresse@domain.de

# turn off the ncurses UI, we want this to be run as a cronjob
text = True

# authenticate by placing a file in the webroot (under .well-known/acme-challenge/)
# and then letting LE fetch it
authenticator = webroot
webroot-path = /var/www/letsencrypt/

Variable domain wird der betroffene Domainname angeben.
Variable email wird für wichtige Meldungen oder für die Schlüsselwiederherstellung benötigt.
Variable webroot-path wird für die temporäre Verifizierungsdatei benötigt.

Zertifikate bei Let’s Encrypt anfordern
Das Anfordern eines Zertifikats erfolgt via Shell.

cd /opt/letsencrypt
./letsencrypt-auto --config /etc/letsencrypt/configs/webserver01.lab01.wydler.eu.conf certonly

Wenn alles funktioneirt hat, erscheint folgender Text:

IMPORTANT NOTES:
- Congratulations! Your certificate and chain have been saved at
   /etc/letsencrypt/live/webserver01.lab01.wydler.eu/fullchain.pem. Your cert will
   expire on 2016-12-30. To obtain a new or tweaked version of this
   certificate in the future, simply run letsencrypt-auto again. To
   non-interactively renew *all* of your certificates, run
   "letsencrypt-auto renew"
- If you like Certbot, please consider supporting our work by:

   Donating to ISRG / Let's Encrypt:   https://letsencrypt.org/donate
   Donating to EFF:                    https://eff.org/donate-le

Zertifikat in der nginx – Konfiguration zuweisen
Im Abschnitt der SSL Konfiguration folgende Zeilen ergänzen.

server {
    listen 443 ssl default_server;
    server_name webserver01.lab01.wydler.eu;
    
    ...
    ssl_certificate /etc/letsencrypt/live/webserver01.lab01.wydler.eu/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/webserver01.lab01.wydler.eu/privkey.pem;
    ...
}

Zum Schluss den Webserver nginx neustarten:

service nginx configtest
service nginx restart

Zertifikate automatisch verlängern
Wie bereits anfangs erwähnt, hat das Zertifikat nur eine Gültigkeit von 90 Tagen. Daher bietet es sich natürlich an, das Ganze via Shellskript und Cronjob zu automatisieren. Das schützt natürlich nicht davor, dass eine Erneuerung fehlschlägt. Daher empfehle ich die Überwachung der Protokolldatei auf dem Server (var/log/letsencrypt) oder aber die verbleibenden Tage des Zertifikats. Denn nicht schlimmeres als im Browser der Hinweis, dass das Zertifikat ungültig ist.

Das Shellskript liegt unter (vi /etc/letsencrypt/renew-letsencrypt.sh) und hat folgenden Inhalt:

#!/bin/bash

cd /opt/letsencrypt/
./letsencrypt-auto -n --config /etc/letsencrypt/configs/webserver01.lab01.wydler.eu.conf certonly

service nginx reload

exit 0

Die Zeile 4 einfach für jeden Let’s Encrypt Konfiguartion kopieren und den Dateinamen anpassen.
Die Datei abspeichern und schließen.

Damit die Datei auch ausgeführt werden, müssen noch die Rechte angepasst werden:

chmod 755 /etc/letsencrypt/renew-letsencrypt.sh

Damit das Skript regelmäßig gestartet wird, erstellen wir noch einen Cronjob:

0 0 1 * * /etc/letsencrypt/renew-letsencrypt.sh

Somit wird das Skript jeden Monat einmal gestartet.