Panik am Sonntag: Die Webseite ist nicht erreichbar, weil ihr Zertifikat abgelaufen ist. Eingeloggt auf dem Server steht der Cronjob zum Erneuern desselben eigentlich, aber der Test zeigt, dass der genutzte Client simp_le nicht mehr funktioniert:
AttributeError: 'module' object has no attribute 'openssl_md_meth_names'
Also erstmal simp_le aktualisiert. Keine Änderung. Google meint, hashlib
fehle und müsse installiert werden. Dort scheitert die Installation:
TypeError: 'frozenset' object is not callable
Hier hat Stackoverflow eine Lösung, das Löschen der Datei /usr/lib/python2.7/lib-dynload/_hashlib.x86_64-linux-gnu.so (wtf?). Tatsächlich hilft das, hashlib wird installierbar. Doch ändert sich für simp_le gar nichts.
An dem Punkt wurde es mir zu doof. Certbot ist der ursprüngliche Letsencrypt-Client. Dort das Release heruntergeladen, fünf Minuten den richtigen Befehl herausgesucht, ausgeführt, nginx zum neuen Zertifikat gelinkt und die Seite war wieder online.
Meine Lektionen:
- Python ist nicht die richtige Sprache für solche Anwendungen. Man sollte etwas möglichst ohne weitere Abhängigkeiten haben, oder etwas das zumindest in einem stabilen Ökosystem agiert. Bash wäre okay, Binaries wären ideal. Python aber ist instabil.
- Mir ist bewusst, dass certbot ebenfalls Python benutzt. Aber das ist die zweite Lektion: Bei solchem Infrastruktur-kritischem Zeug ist es besser, das große Softwareprojekt zu nehmen. Wenn dort etwas bricht wird das große Projekt es schnell reparieren, während die sympathische light-Variante (denn das war simp_le) eben kaputt bleibt.
- Das Zertifikat braucht sein eigenes Monitoring, die Uptime-Kontrolle hat das abgelaufene Zertifikat nicht bemerkt.
Update
Der certbot hat sich seit diesem Wechsel bei mir wirklich bewährt. Es gab keine Fehlermeldungen mehr, keine Probleme mit dem Code. Woran man aber denken sollte ist der Neustart von nginx. Das wurde vorher von dem Cronjob erledigt, der Cronjob den certbot anlegt aber erledigt das nicht. Man könnte den Aufruf von certbot also ebenfalls wieder in ein Skript packen, mit dem Skript den Befehl in der Crontab ersetzen, und dort regelmäßig den Webserver neustarten.