NEWS
ACME - Letsencrypt Zertifikate extrahieren
-
Ich habe einen iobroker, der einige Dienste von Außen erreichbar macht.
Seit dem IoBroker-Admin nur noch auf den ACME.Adapter verweist, hatte ich das Problem, dass ich das erhaltene Cert nur noch für den Admin nutzen konnte. Es tauchte nirgendwo mehr im Dateisystem auf.
Ich habe die Zertifikate letzte Woche dann unter system.certificates bei den Objekten gefunden. Dort stehen sie neben den anderen eingetragenen Zertifikaten in einem JSON in einer "collection", die man im ACME.Adapter anlegt.
Das Script extrahiert key, cert und chain aus der oder den collections und speichert sie in nutzbarer Form in einem Verzeichnis, welches am Anfang des Scripts definiert ist.
Dem Namen wird der Name der collection vorangestellt. (Falls man mehrere collections nutzen möchte ist das erforderlich)Es wird per Voreinstellung ein Flag im gleichen Verzeichnis erzeugt, wenn ein bestehendes Zertifikat sich geändert hat. Damit kann ein systemctl/cron/Aufgabenplanung-Job prüfen, ob ein Dienst neu gestartet werden muss. Das habe ich so gemacht, weil es ohne besondere Rechte funktioniert und unabhängig vom OS oder Geschmacksrichtung.
Die Konfiguration erfolgt in den Zeilen:
// Configuration const certificatesPath = '/opt/iobroker/certificates/'; // Default certificates directory const createFlag = true; // Control whether to create the restart flag
Ich habe mich für /opt/iobroker/certificates/ als Pfadvorgabe entschieden, weil IOBROKER da Schreibrechte besitzt, ohne dass man etwas ändern muss.
Wer da was anderes möchte muss ggf. die Recht selbst anpassen.So kann man die Files in Admin bei den Zertifikaten verlinken und in anderen Adapter nutzen, die die collections von ACME nicht sehen.
Oder man kann z.B. Grafana damit ausstatten.Um das mit GitHub auch mal zu üben, hab ich das hier angelegt. Fragen, Anregungen, Verbesserungsvorschläge oder Hinweise gerne hier. Das Script kann man immer aktuell vom GitHub laden.
Beispiel für debian systemctl timer-job (wenn man Grafana automatisch neu starten will, wenn es ein neues Cert gibt):
Ich habe hier eine collection "home" ... ihr müsste das an eure Namen anpassen, wenn hier unten etwas steht wie
FLAG_FILE="/opt/iobroker/certificates/home_new_ssl_cert.txt"
"home" ist hier der Name der collection, die ich im ACME.Adapter konfiguriert habe
Ebenso ist grafana natürlich nur ein Beispiel.Wir brauchen ein Script, was prüft ob das Flag existiert und dann entweder grafana neu startet und das flag löscht , oder eben nichts tut,
Scriptdatei erstellen:
sudo nano /usr/local/bin/grafana-restart.sh
Diesen Inhalt einfügen
#!/bin/bash # Path to the flag file FLAG_FILE="/opt/iobroker/certificates/home_new_ssl_cert.txt" # Name of the Grafana service GRAFANA_SERVICE="grafana-server" # Check if the flag file exists if [ -f "$FLAG_FILE" ]; then echo "$(date '+%Y-%m-%d %H:%M:%S') - Flag file found. Restarting Grafana..." # Restart the Grafana service systemctl restart "$GRAFANA_SERVICE" # Check if the restart was successful if [ $? -eq 0 ]; then echo "$(date '+%Y-%m-%d %H:%M:%S') - Grafana restarted successfully. Deleting flag file." # Delete the flag file rm "$FLAG_FILE" else echo "$(date '+%Y-%m-%d %H:%M:%S') - Failed to restart Grafana. Flag file not deleted." exit 1 fi else echo "$(date '+%Y-%m-%d %H:%M:%S') - No flag file found. No action needed." fi
Das Script ausführbar machen:
sudo chmod +x /usr/local/bin/grafana-restart.sh
Dann brauchen wir eine systemd-Dienstdatei:
sudo nano /etc/systemd/system/grafana-restart.service
in der dann stehen muss:
[Unit] Description=Restart Grafana if SSL Certificate Flag Exists [Service] Type=oneshot ExecStart=/usr/local/bin/grafana-restart.sh
Dazu einen Timer, der die Dienstdatei zur gewünschten Zeit aufruft.
sudo nano /etc/systemd/system/grafana-restart.timer
mit dem Inhalt:
[Unit] Description=Timer to Restart Grafana if SSL Certificate Flag Exists at 01:00 AM Daily [Timer] OnCalendar=*-*-* 01:00:00 Persistent=true [Install] WantedBy=timers.target
systemctl neu starten, damit der den neuen Dienst sehen kann.
sudo systemctl daemon-reload
Und den Dienst aktivieren:
sudo systemctl enable --now grafana-restart.timer
Und prüfen ob das funktioniert hat:
Flag manuell erzeugen:
sudo touch /opt/iobroker/certificates/home_new_ssl_cert.txt
Dienst von Hand starten (nicht erst um 01:00)
sudo systemctl start grafana-restart.service
Status ausgeben:
systemctl status grafana-restart.timer
Dann sollte das ungefähr so aussehen am Ende:
Sep 22 18:03:02 iobroker2 systemd[1]: Starting Restart Grafana if SSL Certificate Flag Exists... Sep 22 18:03:02 iobroker2 grafana-restart.sh[115815]: 2024-09-22 18:03:02 - Flag file found. Restarting Grafana... Sep 22 18:03:02 iobroker2 grafana-restart.sh[115815]: 2024-09-22 18:03:02 - Grafana restarted successfully. Deleting flag fil> Sep 22 18:03:02 iobroker2 systemd[1]: grafana-restart.service: Succeeded. Sep 22 18:03:02 iobroker2 systemd[1]: Finished Restart Grafana if SSL Certificate Flag Exists.