Nginx mit Let’s Encrypt – Zertfikate nutzen

Letzte Aktualisierung am 22.09.2019, 12:09:56 Uhr

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.

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
sudo apt-get update
sudo apt-get install git -y
sudo git clone https://github.com/certbot/certbot /opt/letsencrypt
sudo apt-get update sudo apt-get install git -y sudo git clone https://github.com/certbot/certbot /opt/letsencrypt
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:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
cd /var/www
mkdir letsencrypt
chgrp www-data letsencrypt
cd /var/www mkdir letsencrypt chgrp www-data letsencrypt
cd /var/www
mkdir letsencrypt
chgrp www-data letsencrypt

Im Anschluss muss die entsprechende nginx – Konfigurationsdatei erweitert werden:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
server {
listen 80 default_server;
server_name webserver01.lab01.wydler.eu;
...
location /.well-known/acme-challenge {
root /var/www/letsencrypt;
}
...
}
server { listen 80 default_server; server_name webserver01.lab01.wydler.eu; ... location /.well-known/acme-challenge { root /var/www/letsencrypt; } ... }
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:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
service nginx configtest
service nginx restart
service nginx configtest service nginx restart
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.

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
mkdir /etc/letsencrypt
mkdir /etc/letsencrypt/configs/
mkdir /etc/letsencrypt mkdir /etc/letsencrypt/configs/
mkdir /etc/letsencrypt
mkdir /etc/letsencrypt/configs/

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

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
vi /etc/letsencrypt/configs/webserver01.lab01.wydler.eu.conf
vi /etc/letsencrypt/configs/webserver01.lab01.wydler.eu.conf
vi /etc/letsencrypt/configs/webserver01.lab01.wydler.eu.conf

Inhalt:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
# 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/
# 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/
# 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.

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
cd /opt/letsencrypt
./letsencrypt-auto --config /etc/letsencrypt/configs/webserver01.lab01.wydler.eu.conf certonly
cd /opt/letsencrypt ./letsencrypt-auto --config /etc/letsencrypt/configs/webserver01.lab01.wydler.eu.conf certonly
cd /opt/letsencrypt
./letsencrypt-auto --config /etc/letsencrypt/configs/webserver01.lab01.wydler.eu.conf certonly

Wenn alles funktioneirt hat, erscheint folgender Text:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
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
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
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.

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
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;
...
}
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; ... }
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:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
service nginx configtest
service nginx restart
service nginx configtest service nginx restart
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:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
#!/bin/bash
cd /opt/letsencrypt/
./letsencrypt-auto -n --config /etc/letsencrypt/configs/webserver01.lab01.wydler.eu.conf certonly
service nginx reload
exit 0
#!/bin/bash cd /opt/letsencrypt/ ./letsencrypt-auto -n --config /etc/letsencrypt/configs/webserver01.lab01.wydler.eu.conf certonly service nginx reload exit 0
#!/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:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
chmod 755 /etc/letsencrypt/renew-letsencrypt.sh
chmod 755 /etc/letsencrypt/renew-letsencrypt.sh
chmod 755 /etc/letsencrypt/renew-letsencrypt.sh

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

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
0 0 1 * * /etc/letsencrypt/renew-letsencrypt.sh
0 0 1 * * /etc/letsencrypt/renew-letsencrypt.sh
0 0 1 * * /etc/letsencrypt/renew-letsencrypt.sh

Somit wird das Skript jeden Monat einmal gestartet.

Abonnieren
Benachrichtige mich bei


0 Comments
neueste
älteste
Inline Feedbacks
View all comments