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

Quellen

Jan Karres

Michis Blog

Lets Encrypt

Certbot