Lets Encrypt mit Nginx auf dem Raspberry Pi
Lets Encrypt stellt kostenlose SSL-Zertifikate zur Verfügung, die vergleichsweise einfach erstellt und eingerichtet werden können. Dafür sind die Zertifikate nur 90 Tage gültig, können aber mit einem "Certbot" automatisiert erneuert werden.
Ich habe Lets Encrypt auf meinem Raspberry Pi unter Nginx eingerichtet, in der Hoffnung, mich nie wieder um meine Zertifikate kümmern zu müssen und von Browsern akzeptiert zu werden.
Lets Encrypt herunterladen
Zum Kopieren von Github wird das Paket "git" benötigt.
sudo apt-get install git
Damit kann das Projekt nun kopiert werden.
cd /opt
sudo git clone https://github.com/letsencrypt/letsencrypt
cd letsencrypt
./certbot-auto --help
Nginx vorbereiten
Zum Datenaustausch benötigt Lets Encrypt Port 80 und ein Webserver der diesen Port verwendet muss gestoppt werden (Modus "standalone"). Wird der Zugriff eines Verzeichnisses aus dem Internet freigegeben, kann Lets Encrypt über diesen mit dem Protokoll Http-01 Daten austauschen und der Webserver muss dafür nicht gestoppt werden (Modus "webroot").
Ich verwende für meine Domain und alle Subdomains ein einziges Verzeichnis für webroot, welches zuvor in jeder Server-Config freigegeben werden muss.
sudo mkdir /var/www/letsencrypt
In allen Server-Configs unter /etc/nginx/sites-enabled/ wird für Lets Encrypt die nachfolgenden Zeilen eingetragen.
################# Lets Encrypt Webroot ###
location /.well-known {
root /var/www/letsencrypt;
}
#################
Anschließend muss der Webserver einmal neu gestartet werden.
sudo nginx -t
sudo service nginx reload
Zertifikat erstellen
Sobald der Zugriff auf das webroot-Verzeichnis freigegeben ist, kann das erste Zertifikat erstellt werden:
./certbot-auto certonly --webroot --rsa-key-size 4096 -d domain.de -w /var/www/letsencrypt
Zertifikat in Nginx einbinden
Unter /etc/letsencrypt/live/ befinden sich nun in einem jeweiligen Unterordner die Zertifikate, welche wie folgt in Nginx in der jeweiligen Server-Config eingebunden werden
server {
listen 80;
listen 443 ssl;
server_name <domain>;
ssl_certificate /etc/letsencrypt/live/<domain>/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/<domain>/privkey.pem;
ssl_trusted_certificate /etc/letsencrypt/live/<domain>/chain.pem;
...
################# Enforce HTTPS ###
if ($scheme = http) {
rewrite ^ https://$server_name$request_uri? permanent;
}
#################
...
Autoupdate mit Systemd
Das Aktualisieren der Zertifikate erfolgt mit einem systemd-Dienst, der täglich von einem systemd-Timer aufgerufen wird.
sudo nano /etc/systemd/system/certbot.service
Der Dienst beinhaltet folgenden Parameter und Befehle.
[Unit]
Description=Let's Encrypt renewal
[Service]
Type=oneshot
ExecStart=/usr/bash /opt/letsencrypt/certbot-auto renew --quiet --agree-tos
ExecStartPost=/bin/systemctl reload nginx.service
Nun muss noch der systemd-Timer erstellt werden.
sudo nano /etc/systemd/system/certbot.timer
Dieser besteht aus den nachfogenden Parametern.
[Unit]
Description=Daily renewal of Let's Encrypt's certificates
[Timer]
OnCalendar=daily
RandomizedDelaySec=1day
Persistent=true
[Install]
WantedBy=timers.target
Danach kann der Timer gestartet und in den Autostart integriert werden:
sudo systemctl start certbot.timer
sudo systemctl enable certbot.timer