Wildcard-Zertifikate automatisch erneuern
Skripte für die automatisierte DNS Validierung von Let's Encrypt Zertifikaten
Zertifikate von Let's Encrypt mit der DNS Validierung lassen sich nur dann automatisch ausstellen und erneuern, wenn der DNS Anbieter eine API bereitstellt. Ist das nicht der Fall, kann über die Nameserver von deSEC deren API verwendet werden.
In einem anderen Artikel dieses Blog wurde beschrieben, wie man mit dem Programm certbot
Wildcard-Zertifikate von Let's Encrypt ausstellt und erneuert. Wildcard-Zertifikate können nur mittels "DNS Challenge" ausgestellt werden, wobei das Programm certbot
von Let's Encrypt ein Token (die "Challenge") erhält, der in einem TXT-Eintrag der Unterdomäne _acme-challenge
der betreffenden Domäne im DNS angelegt werden muss, sodass dieser dort von Let's Encrypt verifiziert werden kann.
certbot
ist über sogenannte Pre- und Post-Validation Hooks in der Lage, diesen TXT-Eintrag anzulegen und nach erfolgter Verifizierung auch wieder zu löschen – sofern der DNS-Anbieter eine entsprechende API anbietet. Ist das nicht der Fall, muss der TXT-Eintrag interaktiv angelegt und entfernt werden, was eine automatische Erneuerung des Zertifikats verhindert.
In diesem Beitrag wird gezeigt, wie die API von deSEC genutzt werden kann, um eine DNS-Challenge durchzuführen. Voraussetzung dafür ist, dass beim Registrar der Domäne die Möglichkeit besteht, externe Nameserver zu verwenden, denn über deSEC lassen sich keine Domänen registrieren.
Vorarbeiten
Es wird ein Konto bei deSEC benötigt, das allerdings kostenlos ist. Mit diesem Konto lassen sich bis zu 15 Domänen anlegen, um deren DNS-Einträge zu verwalten.
Der erste Schritt nach dem Anlegen eines Kontos bei deSEC besteht darin, den in Frage kommenden Domänennamen dort anzulegen und die Nameserver von deSEC (ns1.desec.io
und ns2.desec.org
) beim Registrar der Domäne einzutragen.
Als nächstes muss ein Access-Token für das deSEC Konto erstellt werden, das für den Zugriff auf die API benötigt wird. Dies kann man über die Website von deSEC erledigen.
Anlegen eines TXT-Eintrags
Das Anlegen eines TXT-Eintrages kann über den folgenden Aufruf mit curl
erfolgen:
curl \
-H "Authorization: Token TOKEN" \
-H "Accept: application/json" \
-H "Content-Type: application/json" \
-X PUT \
https://desec.io/api/v1/domains/DOMAIN/rrsets/ \
-d '[{"subname":"_acme-challenge","type":"TXT","records":["\"CHALLENGE\""],"ttl":"3600"}]'
Zu beachten ist, dass die Platzhalter TOKEN
, DOMAIN
und CHALLENGE
durch die entsprechenden tatsächlichen Werte zu ersetzen sind.
Bei einem Aufruf über ein Skript, das als Parameter --manual-auth-hook
dem Programm certbot
übergeben wird, werden die Werte für DOMAIN
und CHALLENGE
von certbot
als Umgebungsvariablen CERTBOT_DOMAIN
und CERTBOT_VALIDATION
exportiert und können somit innerhalb des Skriptes verwendet werden.
Ein solches Skript kann man über dieses Git-Repository herunterladen (desec_auth_hook.sh
).
Löschen eines TXT-Eintrags
Nach erfolgreicher Validierung des TXT-Eintrags durch Let's Encrypt kann dieser wieder entfernt werden.
Dazu dient bei einem Aufruf durch certbot
der Parameter --manual-cleanup-hook
, dem man ein Skript übergeben kann, das im wesentlichen den gleichen curl
-Aufruf enthalten muss, allerdings mit einem leeren Wert für records
:
curl \
-H "Authorization: Token TOKEN" \
-H "Accept: application/json" \
-H "Content-Type: application/json" \
-X PUT \
https://desec.io/api/v1/domains/DOMAIN/rrsets/ \
-d '[{"subname":"_acme-challenge","type":"TXT","records":[],"ttl":"3600"}]'
Ein solches Skript kann man ebenfalls über dieses Git-Repository herunterladen (desec_cleanup_hook.sh
).