it-swarm.com.de

Wie verwende ich die Validierung der DNS-Challenge-Verschlüsselung?

Let's Encrypt hat angekündigt sie haben:

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

Wie mache ich ./letsencrypt-auto ein neues Zertifikat mithilfe der DNS-Challenge-Domain-Validierung generieren?

[~ # ~] edit [~ # ~]
Ich meine: Wie vermeide ich http/https Portbindung mithilfe der neu angekündigten Funktion (20.01.2015), mit der Sie den Domänenbesitz nachweisen können, indem Sie einen bestimmten TXT-Eintrag) in der DNS-Zone der Zieldomäne hinzufügen?

174
Pierre Prinetti

Derzeit ist es möglich, eine DNS-Validierung auch mit dem Client certbot LetsEncrypt 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 gibt Ihnen dann Anweisungen zum manuellen Aktualisieren eines TXT - Datensatzes 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 die LetsEncrypt-Zertifizierungsstelle die Herausforderung ü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 Infos im offiziellen certbot Dokumentation .

Update: manuelle Haken

In der neuen Certbot-Version können Sie Hooks verwenden, z. B. --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, Herausforderungstoken. 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 sind viele verfügbar, z. B. für Cloudflare-DNS.

Weitere Infos zum offiziellen certbot Hooks Dokumentation .

Automatisierung, Erneuerung, Skripterstellung

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

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

pip install certbot-external-auth

Es unterstützt die DNS-, HTTP- und TLS-SNI-Validierungsmethoden. 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 usw.) auf, um die Validierung und Installation durchzuführen. In der Praxis schreiben Sie ein einfaches Handler-/Shell-Skript, das die Eingabeargumente Domain, Token abruft und die DNS-Änderung vornimmt. Wenn der Handler fertig ist, fährt certbot wie gewohnt mit der Validierung fort.

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

Der Handler-Modus ist auch kompatibel mit Dehydrated DNS-Hooks (früher letsencrypt.sh). Es gibt bereits viele DNS-Hooks für gängige Anbieter (z. B. CloudFlare, GoDaddy, AWS). Im Repository befindet sich ein README mit umfangreichen Beispielen und Beispielhandlern.

Beispiel mit Dehydrated DNS-Hook:

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 erstellt JSON-Objekte mit Daten, um die Validierung durchzuführen, zum Beispiel:

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 das neue Zeilenzeichen an STDIN von certbot, um zu signalisieren, dass die Validierung fortgesetzt werden kann.

Dies ermöglicht die Automatisierung und Zertifikatsverwaltung vom zentralen Verwaltungsserver aus. Für die 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.

EDIT: Es gibt auch ein neues Blogpost , das das DNS-Validierungsproblem und die Verwendung des Plugins beschreibt.

EDIT: Wir arbeiten derzeit an Ansible 2-Schritt-Validierung, wird bald aus sein.

228
ph4r05

Ich konnte den dehydrated Client verwenden, um ein Zertifikat mithilfe der DNS-Validierung 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-Validierungs-Hook für Ihre Domain verwenden, es stehen jedoch einige Optionen als Beispiele zur Verfügung:

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

39
alexcline

Bis heute unterstützt der offizielle Client den DNS-01-Challenge-Typ (noch) nicht.

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

Ich habe mir das nicht angesehen, also weiß ich es nicht wirklich. Mein allgemeines Verständnis war nur "noch keine Unterstützung in unserem Python Client für die DNS-Herausforderung").

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

10
Simone Carletti

Ich habe ein Hook-Skript für den letsencrypt.sh-Client geschrieben, mit dem Sie die DNS-Überprüfung von Lets Encrypt für DNS-Anbieter verwenden können, die dies nicht tun Es wird keine API zur Verwendung bereitgestellt (auch bekannt als manuelle Eingabe und Überprüfung erforderlich).

Sie können es hier überprüfen: https://github.com/jbjonesjr/letsencrypt-manual-hook

5
J Jones

Wie in den vorherigen Antworten erwähnt, können Sie eine Domain einfach per DNS überprüfen:

  1. installieren Sie die erforderlichen Anwendungen (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. zertifikat mit manueller DNS-Challenge-Bestätigung für www.example.com generieren (durch Ihre Domain ersetzen): ./dehydrated/dehydrated -c -t dns-01 -d www.example.com -k ./dehydrated/hooks /manual/manual_hook.rb
3
panticz.de

Nachdem ich verschiedene Kombinationen ausprobiert hatte, funktionierte dies für mich mit dehydrated und letsencrypt-manual-hook git-Repositorys. Wenn die folgenden Schritte für Sie funktionieren, vergessen Sie nicht, star diese Repositorys zu verwenden

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 entweder den folgenden Befehl oder GSuite Toolbox ausführen

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

Drücken Sie nun an der Eingabeaufforderung Enter. Dies funktionierte bei mir nicht, obwohl der Datensatz TXT) 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 vorhanden.

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

Zum Erneuern (Mindestwartezeit 30 Tage) muss derselbe Befehl erneut ausgeführt werden.

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

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

1
Harald

Es ist ziemlich einfach, mit --manual-auth-hook und --manual-cleanup-hook in certbot .

certbot-auto --manual --preferred-challenges dns --manual-auth-hook auth.sh --manual-cleanup-hook cleanup.sh -d your.domain.com -d *.wildcard.domains.com`

wo auth.sh wäre so etwas wie

#!/bin/sh

KEYFILE=tsig_key_file

nsupdate -k $KEYFILE <<EOT
server ns.some-domain.com
update add _acme-challenge.$CERTBOT_DOMAIN 60 txt $CERTBOT_VALIDATION
send
EOT

# wait a few seconds to let the change take effect
sleep 5

und cleanup.sh etwas wie

#!/bin/sh

KEYFILE=/opt/certbot-authenticator/tsig

nsupdate -k $KEYFILE<<EOT
server dns-master
update del _acme-challenge.$CERTBOT_DOMAIN
send
EOT

vorausgesetzt, Ihr DNS-Server ist ordnungsgemäß konfiguriert, um dynamische DNS-Aktualisierungen zu ermöglichen (RFC2136). Die Verwendung eines TSIG-Schlüssels wird dringend empfohlen. Wenn Sie ihn jedoch nicht verwenden möchten, schneiden Sie einfach das -k $KEYFILE Option beim Aufrufen von nsupdate.

0
karlsebal