letsencrypt.sh
Ich weiß nicht, wie oft ich schon Mails von Bloglesern erhalten habe, mein SSL-Zertifikat sei abgelaufen und ich sollte es doch endlich mal erneuern. Nicht dass mir mein Monitoring das nicht rechtzeitig gesagt hätte, auch https://startssl.com hat mir immer rechtzeitig eine entsprechende Info geschickt. Aber Zertifikatupdates sind einfach umständlich und doof.
Um so erfreuter war ich, als https://letsencrypt.org sich anschickte hier Abhilfe zu schaffen. Doch der Betatest brachte einige Ernüchterung. Der Standard-Client brachte nicht nur zahlreiche Dependencies und damit überraschend viel Komplexität mit sich, er wollte außerdem auf genau den Ports laufen, die mein Webserver belegt. Das manuelle Verfahren, welches zumindest die letztgenannte Einschränkung nicht mit sich brachte war leider nicht sauber automatisierbar, da es ständig irgendwelche Rückfragen stellte.
Abhilfe schaffte hier [[https://github.com/lukas2511/letsencrypt.sh|letsencrypt.sh]]. Es benötigt lediglich sed
und curl
, beides ist sowieso installiert. Das eigentliche Script ist in Bash geschrieben und deutlich überschaubarer als der letsencrypt-Standard-Client. Der einzige Nachteil, die Apache-Konfiguration muss ich weiterhin selbst übernehmen, doch das hatte der letsencrypt-Client auch nicht sauber hinbekommen.
Die Konfiguration von letsencrypt.sh ist denkbar einfach, zunächst clont man das Git-Repository und erstellt ein Verzeichnis für die Konfigurationsdateien und Zertifikate:
cd /opt
git clone https://github.com/lukas2511/letsencrypt.sh
mkdir -p /etc/letsencrypt.sh
mkdir -p /var/www/letsencrypt.sh/
chown www-data:www-data /var/www/letsencrypt.sh
cp letsencrypt.sh/config.sh.example /etc/letsencrypt.sh/config.sh
cp letsencrypt.sh/domains.txt.example /etc/letsencrypt.sh/domains.txt
Nun wird die Datei /etc/letsencrypt.sh/config.sh
angepasst:
BASEDIR=”/etc/letsencrypt.sh/”
WELLKNOWN=”/var/www/letsencrypt.sh/”
PRIVATE_KEY=”${BASEDIR}/private_key.pem”
HOOK=”${BASEDIR}/hook.sh”
CONTACT_EMAIL=”ssl@example.com”
Hinweis: Es sind nur die Werte aufgeführt die abgeändert werden müssen. Alle anderen Werte können im Defaultzustand verbleiben.
Damit letsencrypt später unsere Domains verifizieren kann wird, während der Zertifikatserzeugung, eine Datei unter /var/www/letsencrypt.sh/www/.well-known/
abgelegt und von letsencrypt über HTTP abgerufen. Damit dies für jede beliebige Domain funktioniert erweitern wir nun noch unsere Apache-Konfiguration mittels der Datei /etc/apache2/conf.d/letsencrypt
:
Alias /.well-known/acme-challenge /var/www/letsencrypt.sh/
Options None
AllowOverride None
Order allow,deny
Allow from all
Die Apache-SSL-Konfiguration (/etc/apache2/sites-enabled/*
) wird wie folgt erweitert/abgeändert:
SSLEngine On
SSLCertificateFile /etc/letsencrypt.sh/certs/example.com/cert.pem
SSLCertificateKeyFile /etc/letsencrypt.sh/certs/example.com/privkey.pem
SSLCertificateChainFile /etc/letsencrypt.sh/certs/example.com/chain.pem
SSLCACertificateFile /etc/letsencrypt.sh/certs/example.com/fullchain.pem
SSLHonorCipherOrder On
SSLCipherSuite ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA256:ECDHE-RSA-AES256-SHA:ECDHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES128-SHA256:DHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES256-GCM-SHA384:AES128-GCM-SHA256:AES256-SHA256:AES128-SHA256:AES256-SHA:AES128-SHA:DES-CBC3-SHA:HIGH:!aNULL:!eNULL:!EXPORT:!DES:!MD5:!PSK:!RC4
Nun erstellen wir noch die Datei /etc/letsencrypt.sh/hook.sh
:
#!/bin/bash
if [ ${1} == “deploy_cert” ]; then
echo ” + Hook: Restarting Apache…”
/etc/init.d/apache2 reload
else
echo ” + Hook: Nothing to do…”
fi
Das kleine Script wird später dafür sorgen dass unser Apache unser aktualisiertes Zertifikat einliest. Ausführbar machen nicht vergessen: chmod +x /etc/letsencrypt.sh/hook.sh
Nun müssen wir nur noch die Domains angeben, für die wir ein SSL-Zertifikat haben/aktuell halten möchten. Hierzu dient die Datei /etc/letsencrypt.sh/domains.txt
:
example.org www.example.org
example.com www.example.com wiki.example.com
Jede Domain, mit ihren jeweiligen Subdomains, wird in eine eigene Zeile geschrieben.
Mit dem Befehl /opt/letsencrypt.sh/letsencrypt.sh -c
können wir nun unsere Zertifikate erzeugen/aktualisieren. Denselben Befehl in einen @daily
oder @weekly
-Cronjob verpacken und an der Zertifikatsfront ist erst einmal Ruhe. Ich fürchte nur ich werde die jährlichen Hinweisgebermails vermissen… ;)