Installation

# apt install certbot python-ndg-httpsclient

Registrierung bei Certbot

Um Certbot nutzen zu können, muss man sich registrieren und ein Konto erstellen, über das dann die Zertifikate verwaltet werden.

# certbot register --agree-tos -m technik@jo-so.de

HTTPS-Zertifikat erstellen

Der Webserver muss bereits konfiguriert sein. Certbot legt im Hauptverzeichnis kurzzeitig einige Dateien an, die der CA die Kontrolle über den Server anzeigen.

# certbot certonly --webroot -w /srv/www/jo-so.de --domain jo-so.de,www.jo-so.de --must-staple

Wenn man im Nachhinein einen Parameter ändern will (z. B. must-staple hinzufügen), kann man den Befehl neu ausführen und muss die Änderung entsprechend bestätigen.

Für Fehler wegen Zeitüberschreitung bei must-staple ist der Beitrag interessant.

HTTP-Zertifikat mit ECDSA erstellen

Prüfsummen für HTTP-Public-Key-Pinning (HPKP) erstellen

Zertifikat bei Nginx einrichten

server {
    listen 80;
    listen [::]:80;

    server_name jo-so.de www.jo-so.de;

    # redirect permanently all requests to HTTPS
    return 301 https://$host$request_uri;
}

server {
    listen 443 http2 ssl;
    listen [2a03:4000:8:213::1]:443 http2 ssl;

    server_name www.jo-so.de;

    ssl_certificate /etc/letsencrypt/live/jo-so.de/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/jo-so.de/privkey.pem;

    add_header Strict-Transport-Security "max-age=31536000; includeSubdomains; preload";

    # redirect permanent all requests to HTTPS
    return 301 https://jo-so.de$request_uri;
}

# in nginx.conf
http {
    ssl_protocols TLSv1.2 TLSv1.3; # Dropping SSLv3, ref: POODLE
    ssl_prefer_server_ciphers on;

    # extract from https://wiki.openssl.org/index.php/Diffie-Hellman_parameters#RFC_7919_Groups
    ssl_dhparam /etc/ssl/private/ffdhe3072.pem;
    ssl_ciphers TLSv1.2:!eNULL:!SHA1:!SHA256:!SHA384:!RSA:!DHE-RSA-AES256-GCM-SHA384;

    ssl_session_cache shared:SSL:10m;
    ssl_session_timeout 2h;

    ssl_stapling on;
    ssl_stapling_verify off;
}

server {
    listen 443 http2 ssl;
    listen [2a03:4000:8:213::1]:443 http2 ssl;

    server_name jo-so.de www.jo-so.de;

    ssl_certificate /etc/letsencrypt/live/jo-so.de/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/jo-so.de/privkey.pem;

    ssl_certificate /etc/letsencrypt/live/jo-so.de/fullchain.ecdsa.pem;
    ssl_certificate_key /etc/letsencrypt/live/jo-so.de/privkey.ecdsa.pem;

    access_log /var/log/nginx/jo-so_access.log;
    error_log /var/log/nginx/jo-so_error.log;

    root /srv/www/jo-so.de;

    # Add index.php to the list if you are using PHP
    index index.html index.htm;

    add_header Strict-Transport-Security "max-age=15552000; includeSubdomains; preload";
#    add_header Public-Key-Pins "max-age=345600; pin-sha256=\"L/GBYFdJga1U+I3ZOmPMptG+y1Noe+/9z56JeXnBqG0=\"";

    if ($host != $server_name) {
            # redirect permanent all requests to HTTPS
            return 301 https://$server_name$request_uri;
    }

    location / {
        # First attempt to serve request as file, then
        # as directory, then fall back to displaying a 404.
        try_files $uri $uri/ =404;
    }
}

Mit nginx -t kann man bei Nginx prüfen, ob die Konfiguration korrekt ist.

Prüfen der Einstellungen mit SSL Labs

Bei SSL Labs kann man prüfen, ob die Einstellungen richtig und wie gut sie sind. Für eine bessere Bewertung sollte man bei Public-Key-Pins zwei Schlüssel angeben. Nur leider weiß ich noch nicht, wie man mit Certbot das lösen kann.

Prüfen der Einstellungen mit Internet.nl

Bei Internet.nl kann man ebenfalls die Einstellungen für die Webseite prüfen lassen und bekommt Hinweise, welche Einstellungen angepasst werden sollten.

Weitere Certbot-Befehle

Nginx über neue Zertifikate benachrichtigen

Certbot bietet die Möglichkeit über Hooks, Befehle nach der Erneuerung von Zertifikaten auszuführen. Einfach ein Skript /etc/letsencrypt/renewal-hooks/post/50_nginx erstellen und Ausführungsrechte geben:

#!/bin/sh

servicectl reload nginx.service

Certbot mit Readonly-Root

Damit automatisiert und regelmäßig die Zertifikate aktualisiert werden können, muss das Verzeichnis mit den Schlüsseln unter /etc/letsencrypt schreibbar sein. Die lässt sich über Hooks lösen:

Weiterhin muss noch ein Symlink für die Lock-Datei erstellt werden:

ln -s /var/lib/letsencrypt/etc-letsencrypt-lock /etc/letsencrypt/.certbot.lock

Weitere Informationen