Du willst ein gültiges HTTPS-Zertifikat für einen Dienst, den aus dem Internet niemand erreichen soll. DNS-01 beweist, dass dir die Domain gehört, ohne einen einzigen Port zu öffnen.
Kurz gesagt
Die DNS-01-Challenge ist ein Weg, die Kontrolle über einen Domainnamen in ACME nachzuweisen, dem Protokoll, mit dem Let’s Encrypt und andere Zertifizierungsstellen Zertifikate automatisch ausstellen (RFC 8555) [1]. Dein ACME-Client legt einen TXT-Eintrag unter _acme-challenge.<deine Domain> an, und die Zertifizierungsstelle fragt ihn im öffentlichen DNS ab [1][2]. Von den Prüfverfahren HTTP-01, DNS-01 und TLS-ALPN-01 bei Let’s Encrypt taugt nur DNS-01 für Wildcard-Zertifikate, und es funktioniert auch für Namen, deren Webserver nicht im Internet stehen [2]. Unsere Einschätzung: DNS-01 ist für interne Dienste im Homelab die richtige Wahl, solange du den DNS-API-Schlüssel schützt, der dazugehört.
So funktioniert’s
- Der Name des Eintrags. Der Client bildet den Prüfnamen, indem er das Label
_acme-challengevor die zu prüfende Domain setzt [1]. - Der Wert des Eintrags. Der Wert leitet sich aus dem Token der Zertifizierungsstelle und deinem ACME-Kontoschlüssel ab; RFC 8555 legt ihn als base64url-kodierten SHA-256-Hash dieser „Key Authorization“ fest [1][2].
- Die Prüfung. Sobald der Client meldet, dass der Eintrag steht, fragt Let’s Encrypt das DNS ab; passt der Wert, kann das Zertifikat ausgestellt werden [2]. Mehrere TXT-Einträge unter demselben Namen sind erlaubt, etwa wenn eine Wildcard und ein normaler Name zusammen geprüft werden, aber alte solltest du entfernen, weil Let’s Encrypt zu große Antworten ablehnt [2].
- Automatik braucht eine API. Laut Let’s Encrypt ist DNS-01 nur sinnvoll, wenn dein DNS-Anbieter eine API für automatische Änderungen hat, und ohne Prüfung der Verteilung sollte ein Client lange genug warten, oft bis zu einer Stunde, bevor er die Prüfung auslöst [2].
- Der Schlüssel ist das Risiko. Volle DNS-API-Zugangsdaten auf einem Webserver vergrößern den Schaden deutlich, wenn dieser Server gehackt wird. Let’s Encrypt empfiehlt eng begrenzte Zugangsdaten oder die Prüfung auf einem eigenen Rechner, der die Zertifikate dann weiterkopiert [2].
- Delegation hilft. Let’s Encrypt folgt bei DNS-01 CNAME- und NS-Einträgen, du kannst
_acme-challengealso auf eine eigene Zone zeigen lassen, die nur der Prüfung dient [2]. - Weiter absichern. Ein CAA-Eintrag nennt die Zertifizierungsstellen, die für deine Domain ausstellen dürfen; mit dem Parameter
validationmethodsbeschränkst du Let’s Encrypt zum Beispiel aufdns-01[3][4].
Ein Praxisbeispiel
Du willst nas.example.com im Heimnetz mit gültigem Zertifikat betreiben, ohne Port 80 weiterzuleiten. Dein ACME-Client (im Reverse Proxy oder als eigenes Werkzeug) bekommt einen API-Token, der nur TXT-Einträge in deiner Zone ändern darf, legt den Challenge-Eintrag an und wartet, bis er verteilt ist. Währenddessen prüfst du, was das öffentliche DNS liefert:
dig +short TXT _acme-challenge.nas.example.comZeigt die Antwort den erwarteten Wert, kann die Prüfung gelingen [1][2]. Danach beschränkt ein CAA-Eintrag wie example.com. CAA 0 issue "letsencrypt.org; validationmethods=dns-01" die Ausstellung auf diese Methode [3]. Der Name nas.example.com ist ein ausgedachtes Beispiel und keiner unserer Hosts.
Prüfliste
- Prüfe, ob dein DNS-Anbieter eine API anbietet, bevor du dich für DNS-01 entscheidest [2].
- Erstelle einen API-Token mit den engsten Rechten, die dein Anbieter erlaubt, und lege ihn nie in ein Repository [2].
- Delegiere
_acme-challengeper CNAME an eine eigene Zone, wenn dein Anbieter Tokens nicht eingrenzen kann [2]. - Gib deinem Client genug Wartezeit für die Verteilung, bevor er die Prüfung auslöst [2].
- Räume alte
_acme-challenge-TXT-Einträge auf [2]. - Lege einen CAA-Eintrag an, der deine Zertifizierungsstelle und auf Wunsch die Prüfmethode nennt [3][4].