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
User Guide — Certbot 1.19.0.dev0 documentation
# certbot certonly --webroot -w /srv/www/jo-so.de --domain jo-so.de,www.jo-so.de \ --must-staple --key-type ecdsa --cert-name jo-so.de-ecdsa
Nginx unterstützt ECDSA und RSA zur selben Zeit erst ab Version 1.11.0; siehe ssl_certificate Einstellung von Nginx
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-ecdsa/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/jo-so.de-ecdsa/privkey.pem;
Im Firefox steht in den Zertifikatinformationen unter Public Key Info dann Algorithm: Elliptic Curve.
Wenn man nur ECDSA verwendet, braucht man nicht die Diffie-Hellman-Parameter.
ECDSA soll besser sein als RSA und weniger CPU verbrauchen: Is It Time To Upgrade To ECC SSL Certificate (ECDSA)?
Prüfsummen für HTTP-Public-Key-Pinning (HPKP) erstellen
- Das funktioniert nicht, da certbot immer einen neuen Schlüssel erstellt siehe Using letsencrypt certificates with DANE und Certbot support DANE
- Die Prüfsumme steht auch bei SSL Labs unter Certification Paths.
Verschiedene Befehle von Mozilla Developer Network und aus dem RFC 7469
Die Prüfsumme des eigenen Schlüssels:
# openssl x509 -noout -in live/jo-so.de/cert.pem -pubkey \ |openssl rsa -pubin -outform der |openssl dgst -sha256 -binary | base64 L/GBYFdJga1U+I3ZOmPMptG+y1Noe+/9z56JeXnBqG0=
Zertifikat bei Nginx einrichten
Als Diffie-Hellman-Parameter sollten nur noch die Werte aus RFC 7919, Negotiated Finite Field Diffie-Hellman Ephemeral Parameters for Transport Layer Security (TLS) verwendet werden. Diese sind im OpenSSLWiki oder bei Unix & Linux Stack Exchange zu finden.
Die verkürzte Liste der ssl_ciphers habe ich der Seite zum Beschleunigen des SSL-Handshakes entnommen und DHE-RSA-AES256-GCM-SHA384 entfernt, weil Internet.nl diesen bemängelt hat.
Bei den SSL-Protokollen habe ich TLSv1 entfernt, da laut SSL Labs dieses nur noch für alte Programmen notwendig ist, einfach nicht mehr unterstützt werden sollen.
Bei OSCP Stapling ruft der Server regelmäßig bei der CA eine Gültigkeitskennung seines Zertifikats ab, die er dem Client mitgibt. Somit braucht der Client nicht selbst bei der CA nachfragen und verrät ihr so nicht, dass er gerade eine Anfrage an den Server geschickt hat. OCSP Stapling Nginx: Working Guide to Enable
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.
- Mozilla SSL Configuration Generator
- Security/Server Side TLS - MozillaWiki
- IT Security Guidelines for Transport Layer Security (TLS)
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
- Zertifikate von Certbot auflisten:
certbot certificates
- Zertifikat widerrufen:
certbot revoke --cert-path archive/jo-so.de
- E‑Mailadresse der Registrierung ändern:
certbot register --update-registration -m technik@jo-so.de
- Account löschen:
certbot unregister --account …
mit der ID/Verzeichnisnamen in /etc/letsencrypt/accounts/acme-v01.api.letsencrypt.org/directory.
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:
/etc/letsencrypt/renewal-hooks/pre/10_remount-rw-root
#!/bin/sh mount -o remount,rw /
/etc/letsencrypt/renewal-hooks/post/90_remount-ro-root
#!/bin/sh # recreate the link, because certbot removes it everytime he can ln -s /var/lib/letsencrypt/etc-letsencrypt-lock /etc/letsencrypt/.certbot.lock mount -o remount,ro /
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
Here's another free CA as an alternative to Let's Encrypt!
certbot --server
certbot docuacme.sh unterstützt ECDSA, Umstieg auf acme.sh