Wie verwende ich die Validierung der DNS-Herausforderung "Let's Encrypt"?

160

Let's Encrypt hat angekündigt, dass sie Folgendes haben:

Unterstützung für die ACME-DNS-Abfrage aktiviert

Wie erstelle ich ./letsencrypt-autoein neues Zertifikat mithilfe der Überprüfung der DNS-Abfragedomäne?

BEARBEITEN
Ich meine: Wie vermeide ich die http/httpsPortbindung, indem ich die neu angekündigte Funktion (20.01.2015) verwende, mit der Sie die Domain-Inhaberschaft durch Hinzufügen eines bestimmten TXT-Eintrags in der DNS-Zone der Zieldomäne nachweisen können?

Pierre Prinetti
quelle
3
Nebenbemerkung: Certbot (dies ist der neue Name für den letsencrypt-Client) ermöglicht jetzt standardmäßig die webroot-basierte Authentifizierung.
Pierre Prinetti

Antworten:

204

Derzeit ist es möglich, eine DNS-Validierung auch mit dem certbot LetsEncrypt-Client im manuellen Modus durchzuführen. Eine Automatisierung ist ebenfalls möglich (siehe unten).

Manuelles Plugin

Sie können entweder eine manuelle Überprüfung durchführen - mit dem manuellen Plugin.

certbot -d bristol3.pki.enigmabridge.com --manual --preferred-challenges dns certonly

Certbot bietet Ihnen dann eine Anleitung zum manuellen Aktualisieren eines TXT-Eintrags für die Domain, um mit der Validierung fortzufahren.

Please deploy a DNS TXT record under the name
_acme-challenge.bristol3.pki.enigmabridge.com with the following value:

667drNmQL3vX6bu8YZlgy0wKNBlCny8yrjF1lSaUndc

Once this is deployed,
Press ENTER to continue

Nachdem Sie den DNS-Eintrag aktualisiert haben, drücken Sie die Eingabetaste. Certbot wird fortgesetzt. Wenn LetsEncrypt CA die Abfrage überprüft, wird das Zertifikat wie gewohnt ausgestellt.

Sie können auch einen Befehl mit mehr Optionen verwenden, um die Interaktivität zu minimieren und Certbot-Fragen zu beantworten. Beachten Sie, dass das manuelle Plugin den nicht interaktiven Modus noch nicht unterstützt.

certbot --text --agree-tos --email [email protected] -d bristol3.pki.enigmabridge.com --manual --preferred-challenges dns --expand --renew-by-default  --manual-public-ip-logging-ok certonly

Die Erneuerung funktioniert nicht mit dem manuellen Plugin, da es im nicht interaktiven Modus ausgeführt wird. Weitere Informationen finden Sie in der offiziellen Certbot- Dokumentation .

Update: manuelle Haken

In der neuen Certbot Version können Sie mit Haken , zum Beispiel --manual-auth-hook, --manual-cleanup-hook. Die Hooks sind externe Skripte, die von Certbot ausgeführt werden, um die Aufgabe auszuführen.

Informationen werden in Umgebungsvariablen übergeben - z. B. Domäne zur Validierung, Challenge-Token. Vars: CERTBOT_DOMAIN, CERTBOT_VALIDATION, CERTBOT_TOKEN.

certbot certonly --manual --preferred-challenges=dns --manual-auth-hook /path/to/dns/authenticator.sh --manual-cleanup-hook /path/to/dns/cleanup.sh -d secure.example.com

Sie können Ihren eigenen Handler schreiben oder bereits vorhandene verwenden, es stehen viele zur Verfügung, z. B. für Cloudflare DNS.

Weitere Informationen zum offiziellen Certbot Haken Dokumentation

Automatisierung, Erneuerung, Skripterstellung

Wenn Sie die Validierung von DNS-Anfragen automatisieren möchten, ist dies mit vanila certbot derzeit nicht möglich. Update: Mit den Certbot-Hooks ist eine gewisse Automatisierung möglich.

Wir haben daher ein einfaches Plugin erstellt, das die Skripterstellung mit DNS-Automatisierung unterstützt. Es ist als certbot-external-auth verfügbar .

pip install certbot-external-auth

Es unterstützt die Validierungsmethoden DNS, HTTP und TLS-SNI. Sie können es entweder im Handler-Modus oder im JSON-Ausgabemodus verwenden.

Handler-Modus

Im Handler-Modus ruft das certbot + -Plugin externe Hooks (ein Programm, ein Shell-Skript, Python, ...) auf, um die Validierung und Installation durchzuführen. In der Praxis schreiben Sie ein einfaches Handler- / Shell-Skript, das Eingabeargumente abruft - Domain, Token und nimmt die Änderung in DNS vor. Wenn der Handler fertig ist, fährt certbot wie gewohnt mit der Validierung fort.

Dies gibt Ihnen zusätzliche Flexibilität, eine Verlängerung ist ebenfalls möglich.

Der Handler-Modus ist auch mit dehydrierten DNS-Hooks (vormals letsencrypt.sh) kompatibel . Es gibt bereits viele DNS-Hooks für gängige Anbieter (z. B. CloudFlare, GoDaddy, AWS). Im Repository gibt es eine README-Datei mit umfangreichen Beispielen und Beispielhandlern.

Beispiel mit dehydriertem DNS-Haken:

certbot \
    --text --agree-tos --email [email protected] \
    --expand --renew-by-default \
    --configurator certbot-external-auth:out \
    --certbot-external-auth:out-public-ip-logging-ok \
    -d "bristol3.pki.enigmabridge.com" \
    --preferred-challenges dns \
    --certbot-external-auth:out-handler ./dehydrated-example.sh \
    --certbot-external-auth:out-dehydrated-dns \
    run 

JSON-Modus

Ein weiterer Plugin-Modus ist der JSON-Modus. Es wird ein JSON-Objekt pro Zeile erstellt. Dies ermöglicht eine kompliziertere Integration, z. B. wenn Ansible oder ein Deployment Manager certbot aufruft. Die Kommunikation erfolgt über STDOUT und STDIN. Cerbot erzeugt ein JSON-Objekt mit Daten, um die Validierung durchzuführen, zB

certbot \
    --text --agree-tos --email [email protected] \
    --expand --renew-by-default \
    --configurator certbot-external-auth:out \
    --certbot-external-auth:out-public-ip-logging-ok \
    -d "bristol3.pki.enigmabridge.com" \
    --preferred-challenges dns \
    certonly 2>/dev/null

{"cmd": "perform_challenge", "type": "dns-01", "domain": "bs3.pki.enigmabridge.com", "token": "3gJ87yANDpmuuKVL2ktfQ0_qURQ3mN0IfqgbTU_AGS4", "validation": "ejEDZXYEeYHUxqBAiX4csh8GKkeVX7utK6BBOBshZ1Y", "txt_domain": "_acme-challenge.bs3.pki.enigmabridge.com", "key_auth": "3gJ87yANDpmuuKVL2ktfQ0_qURQ3mN0IfqgbTU_AGS4.tRQM98JsABZRm5-NiotcgD212RAUPPbyeDP30Ob_7-0"}

Sobald DNS aktualisiert wurde, sendet der Anrufer ein Zeilenumbruchzeichen an STDIN des Certbot, um zu signalisieren, dass die Validierung fortgesetzt werden kann.

Dies ermöglicht die Automatisierung und Zertifikatsverwaltung vom zentralen Verwaltungsserver aus. Zur Installation können Sie Zertifikate über SSH bereitstellen.

Weitere Informationen finden Sie in der Readme- Datei und in den Beispielen zu certbot-external-auth GitHub.

BEARBEITEN: Es gibt auch einen neuen Blog-Beitrag , der das DNS-Validierungsproblem und die Verwendung des Plugins beschreibt.

BEARBEITEN: Wir arbeiten derzeit an der zweistufigen Ansible-Validierung.

ph4r05
quelle
Wenn Sie eine Website auf einen anderen Server migrieren, möchten Sie möglicherweise ein neues Zertifikat, bevor Sie den A-Datensatz wechseln. Sie können die manuelle Methode ( certbot certonly --preferred-challenges dns -d example.com) für die erste Anforderung verwenden. Verwenden Sie nach dem Testen und Wechseln des A-Records die übliche Webroot-Methode ( certbot certonly webroot -d example.com -w /path/to/webroot) und verwenden Sie dabei genau dieselben Domainnamen wie zuvor. Bei korrekter Ausführung erkennt certbot das vorhandene Zertifikat / die vorhandene Konfiguration und aktualisiert die Erneuerungseinstellungen, sodass das Zertifikat in Zukunft automatisch erneuert wird.
Marcovtwout
Es funktioniert, Vorsicht vor AWS Firewall auf EC2-Ebene
jruzafa
Ich bin mir sicher, dass ich gerne wissen möchte, was --manual-public-ip-logging-ok bedeutet ... die Dokumentation ist kryptisch und alle Beispiele, die es verwenden, erklären es nicht ... einschließlich dieses.
Rondo
Erfordert der Erneuerungsprozess jedes Mal einen neuen TXT-Datensatz?
Old Geezer
1
@Rondo Wenn Sie ein Zertifikat im manuellen Modus interaktiv anfordern, wird diese Aufforderung angezeigt Bitte stellen Sie sicher, dass Sie damit einverstanden sind. " Diese Option sagt Ja zu dieser Eingabeaufforderung.
muru
39

Ich konnte den dehydratedClient verwenden, um mithilfe der DNS-Validierung ein Zertifikat zu erhalten.

https://github.com/lukas2511/dehydrated

./dehydrated --cron --domain my.domain.example.com --hook ./hook.route53.rb --challenge dns-01

Sie müssen den richtigen DNS-Überprüfungshook für Ihre Domain verwenden, aber als Beispiele stehen einige Optionen zur Verfügung:

https://github.com/lukas2511/dehydrated/wiki/Examples-for-DNS-01-hooks

alexcline
quelle
Das hat bei mir sehr gut funktioniert. Die einzige Einschränkung, die ich hinzufügen möchte, ist, dass ich einige der im route53.rbHook-Skript definierten Gem-Abhängigkeiten installieren musste .
Jmreicha
10

Ab heute unterstützt der offizielle Client den Aufforderungstyp DNS-01 (noch) nicht.

Siehe https://community.letsencrypt.org/t/status-of-official-letsencrypt-clients-dns-01-challenge-support/9427

Ich habe das nicht angeschaut, also weiß ich es nicht wirklich. Mein allgemeines Verständnis war nur, "dass unser Python-Client die DNS-Herausforderung noch nicht unterstützt".

Sie können den Fortschritt bei dieser PR verfolgen . Alternativ gibt es einige Clients , die dies bereits unterstützen.

Simone Carletti
quelle
3

Wie bereits in den vorherigen Antworten erwähnt, können Sie eine Domain auf einfache Weise mithilfe von DNS überprüfen:

  1. benötigte Anwendungen installieren (unter Ubuntu): apt-get install -y git ruby letsencrypt git clone https://github.com/lukas2511/dehydrated.git git clone https://github.com/jbjonesjr/letsencrypt-manual-hook.git dehydrated/hooks/manual
  2. Generieren Sie ein Zertifikat mit manueller Bestätigung der DNS-Abfrage für www.example.com (ersetzen Sie es durch Ihre Domain): ./dehydrated/dehydrated -c -t dns-01 -d www.example.com -k ./dehydrated/hooks /manual/manual_hook.rb
panticz.de
quelle
3

Nachdem ich verschiedene Kombinationen ausprobiert hatte, funktionierte dies für mich mit dehydrierten und letsencrypt-manual-hook- Git-Repositories. Wenn die unten genannten Schritte für Sie, vergessen Sie nicht Star diese Repositorys

HINWEIS: Dies gilt zusätzlich zu den Antworten von panticz.de und alexcline

~$ git clone https://github.com/lukas2511/dehydrated.git
~$ git clone https://github.com/jbjonesjr/letsencrypt-manual-hook.git dehydrated/hooks/manual
~$ cd dehydrated
~$ ./dehydrated --register --accept-terms
~$ ./dehydrated --cron --challenge dns-01 --domain your.domain.com --hook ./hooks/manual/manual_hook.rb
#
# !! WARNING !! No main config file found, using default config!
#
Processing your.domain.com
 + Signing domains...
 + Creating new directory /Users/vikas/dehydrated/certs/your.domain.com ...
 + Creating chain cache directory /Users/vikas/dehydrated/chains
 + Generating private key...
 + Generating signing request...
 + Requesting authorization for your.domain.com...
 + 1 pending challenge(s)
 + Deploying challenge tokens...
Checking for pre-existing TXT record for the domain: '_acme-challenge.your.domain.com'.
Create TXT record for the domain: '_acme-challenge.your.domain.com'. TXT record:
'gkIxxxxxxxIcAESmjF8pjZGQrrZxxxxxxxxxxx'
Press enter when DNS has been updated...

Sie erhalten einen Hash (nachdem Sie den obigen Befehl ausgeführt haben), erstellen Sie einen TXT- Eintrag in Ihrem DNS. Stellen Sie sicher, dass es funktioniert, indem Sie den folgenden Befehl oder GSuite Toolbox ausführen

~$ dig TXT _acme-challenge.your.domain.com. +short @8.8.8.8
"gkIxxxxxxxIcAESmjF8pjZGQrrZxxxxxxxxxxx"
~$

Drücken Sie jetzt bei der Eingabeaufforderung die Eingabetaste . Dies hat bei mir nicht funktioniert, obwohl der TXT-Datensatz aktualisiert wurde. Ich musste Strg + C drücken und den Befehl erneut ausführen.

~$ ./dehydrated --cron --challenge dns-01 --domain your.domain.com --hook ./hooks/manual/manual_hook.rb
#
# !! WARNING !! No main config file found, using default config!
#
Processing your.domain.com
 + Signing domains...
 + Generating private key...
 + Generating signing request...
 + Requesting authorization for your.domain.com...
 + 1 pending challenge(s)
 + Deploying challenge tokens...
Checking for pre-existing TXT record for the domain: '_acme-challenge.your.domain.com'.
Found gkIxxxxxxxIcAESmjF8pjZGQrrZxxxxxxxxxxx. match.
 + Responding to challenge for your.domain.com authorization...
Challenge complete. Leave TXT record in place to allow easier future refreshes.
 + Challenge is valid!
 + Requesting certificate...
 + Checking certificate...
 + Done!
 + Creating fullchain.pem...
 + Walking chain...
 + Done!
~$

Jetzt sind Ihre öffentlichen und privaten Zertifikate hier präsent.

$ ls certs/your.domain.com/privkey.pem certs/your.domain.com/fullchain-1517576424.pem

Zum Erneuern (minimale Wartezeit beträgt 30 Tage) wird genau derselbe Befehl erneut ausgeführt.

~$ ./dehydrated --cron --challenge dns-01 --domain your.domain.com --hook ./hooks/manual/manual_hook.rb
vikas027
quelle
1

Hugo Landau hat einen ACME-Client in Go ( https://github.com/hlandau/acme ) geschrieben, der DNS-Herausforderungen unterstützt (mit dem nsupdate-Protokoll von BIND). Es funktioniert seit mindestens 18 Monaten einwandfrei für mich.

Harald
quelle