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).

Top