Let’s Encrypt Zertifikats Renewal bei UberSpace

Der Hoster UberSpace, stellt seinen Kunden die kostenlosen SSL / TLS Zertifikate von Let’s Encrypt zur Verfügung. Die Einbindung eines solchen Zertifikats ist denkbar einfach. Eine detaillierte Beschreibung ist hier zu finden: Klick Bei den Let’s Encrypt Zertifikate gilt zu beachten, dass diese „nur“ 90 Tage lang gültig sind und daher regelmäßig erneuert werden müssen. Hierfür könnte jetzt natürlich einmal pro Monat per Cronjob ein Update durchgeführt werden. Ich wollte jedoch eine Lösung, die mir nur dann ein neues Zertifikat erstellt, wenn das Aktuelle auch wirklich abläuft. Daher habe ich ein kleines Shell Skript geschrieben, welches die Zertifikate bei Uberspace prüft und nur kurz vor Ablauf erneuert.


Das Skript liegt auf meinem UberSpace unter „~/scripts/letsencrypt_renew.sh“. Im Skript sind die Parameter „cert_dir“ und „domains“ an die eigenen Gegebenheiten anzupassen. Das Skript berücksichtigt auch gleich – sofern vorhanden – mehrere Domains in einem Aufwasch. Wenn jedoch Subdomains wie z.B. „foo.domain.tld“, „bar.domain.tld“ etc. verwendet werden, muss nur der Domainname bei „domains“ eingetragen werden, der auch unter „~/.config/letsencrypt/live“ steht.

nano ~/scripts/letsencrypt_renew.sh
#!/bin/sh
valid_days=5
cert_dir='/home/$USER/.config/letsencrypt/live'
cert_file='cert.pem'
domains='domain1.tld domain2.tld domain3.tld'

for domain in $domains; do
   # find all certificates
   export cert="$(find $cert_dir/$domain/ -iname $cert_file | sort -k1)"
   # check certificate validation date
   openssl x509 -checkend $(( $valid_days * 86400 )) -in "$cert" > /dev/null
   # renew certifiacates if they are only 5 more days valid
   if [ $? != 0 ]; then	
      /usr/local/bin/letsencrypt certonly
      /usr/local/bin/uberspace-add-certificate -k $cert_dir/$domain/privkey.pem -c $cert_dir/$domain/$cert_file
   fi
done

Das Skript muss nach dem Abspeichern noch ausführbar gemacht werden.

chmod +x ~/scripts/letsencrypt_renew.sh

Damit das Erneuern der Zertifikate auch wirklich automatisch geschehen kann, muss die Konfigurationsdatei für Let’s Encrypt noch ein wenig modifiziert werden.

nano ~/.config/letsencrypt/cli.ini

Hier muss die Zeile „agree-tos = True“ auskommentiert werden. Zusätzlich muss der Konfigurationseintrag „renew-by-default = True“ hinzugefügt werden.

Lets Encrypt Zertifikats Renewal UberSpace

Wird die Datei „~/.config/letsencrypt/cli.ini“ verändert, indem beispielsweise eine Subdomain entfernt wird, nachdem bereits ein Let’s Encrpyt Zertifikat ausgestellt wurde, ändert sich ggf. die Ordnerstruktur für die Zertifikate. Die neuen Zertifikate liegen dann unter „~/.config/letsencrypt/live/domain.tld-0001/“ statt wie zuvor unter „~/.config/letsencrypt/live/domain.tld/“ Dies muss beim Prüfen der bestehenden und beim Importieren der neuen Zertifikate berücksichtigt werden. Hierzu kann der Variablenwert „domains“ im Skript entsprechend angepasst werden.

Wer den Prozess jetzt testen möchte, kann das Skript einfach mal ausführen.

sh ~/scripts/letsencrypt_renew.sh

Zum Schluss wird noch ein Cronjob eingerichtet, der das Skript täglich ausführt. Somit wird sichergestellt, dass die Zertifikate nicht ablaufen können.

crontab -e
# Lets Encrypt Certificate renewal
@daily /home/$USER/scripts/letsencrypt_renew.sh

Die Variable „$USER“ muss auch hier durch den eigenen Benutzernamen ersetzt werden. Wenn der Cronjob abgespeichert ist, wird ab sofort das Let’s Encrypt Zertifikat bei Bedarf automatisch verlängert. Das Skript kann natürlich auch außerhalb von UberSpace verwendet werden. Hier werden die Pfade und die „letsencrypt“ Befehle etwas modifiziert werden müssen. Für Anregungen, Verbesserungsvorschläge und Fragen stehen die Kommentare zur Verfügung.