Come usare Let's Encrypt la convalida della sfida DNS?


160

Let's Encrypt ha annunciato di avere:

Attivazione del supporto per la sfida ACME DNS

Come faccio a ./letsencrypt-autogenerare un nuovo certificato utilizzando la convalida del dominio di verifica DNS?

EDIT
intendo: come evitare il http/httpsbinding delle porte, utilizzando la funzione appena annunciata (20-01-2015) che consente di dimostrare la proprietà del dominio aggiungendo un record TXT specifico nella zona DNS del dominio di destinazione?


3
Nota a margine : Certbot (questo è il nuovo nome per il client letsencrypt) ora consente l'autenticazione basata su webroot per impostazione predefinita.
Pierre Prinetti,

Risposte:


205

Attualmente è possibile eseguire una convalida DNS anche con il client certbot LetsEncrypt in modalità manuale. L'automazione è anche possibile (vedi sotto).

Plugin manuale

Puoi eseguire una verifica manuale - con il plug-in manuale.

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

Certbot fornirà quindi le istruzioni per aggiornare manualmente un record TXT per il dominio al fine di procedere con la convalida.

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

Dopo aver aggiornato il record DNS, premere Invio, certbot continuerà e se LetsEncrypt CA verifica la sfida, il certificato viene emesso normalmente.

Puoi anche usare un comando con più opzioni per ridurre al minimo l'interattività e rispondere alle domande del certbot. Si noti che il plug-in manuale non supporta ancora la modalità non interattiva.

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

Il rinnovo non funziona con il plug-in manuale poiché viene eseguito in modalità non interattiva. Maggiori informazioni nella documentazione ufficiale di Certbot .

Aggiornamento: ganci manuali

Nella nuova versione è possibile utilizzare Certbot ganci , ad esempio --manual-auth-hook, --manual-cleanup-hook. Gli hook sono script esterni eseguiti da Certbot per eseguire l'attività.

Le informazioni vengono trasmesse nelle variabili di ambiente, ad esempio dominio da convalidare, token di verifica. 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

Puoi scrivere il tuo gestore o usare già esistenti, ce ne sono molti disponibili, ad esempio, per Cloudflare DNS.

Maggiori informazioni ufficiali Certbot documentazione ganci

Automazione, rinnovo, scripting

Se si desidera automatizzare la convalida delle sfide DNS, al momento non è possibile con vanila certbot. Aggiornamento: un po 'di automazione è possibile con gli hook Certbot.

Abbiamo quindi creato un semplice plug-in che supporta gli script con l'automazione DNS. È disponibile come certbot-external-auth .

pip install certbot-external-auth

Supporta metodi di validazione DNS, HTTP, TLS-SNI. È possibile utilizzarlo nella modalità gestore o nella modalità di output JSON.

Modalità gestore

Nella modalità gestore, il plug-in certbot + chiama hook esterni (un programma, script di shell, python, ...) per eseguire la convalida e l'installazione. In pratica scrivi un semplice script gestore / shell che ottiene argomenti di input - dominio, token e apporta le modifiche al DNS. Al termine del gestore, certbot procede con la convalida come al solito.

Questo ti dà una flessibilità extra, è anche possibile il rinnovo.

La modalità gestore è anche compatibile con gli hook DNS disidratati (ex letsencrypt.sh). Esistono già molti hook DNS per provider comuni (ad es. CloudFlare, GoDaddy, AWS). Nel repository c'è un file README con ampi esempi e gestori di esempi.

Esempio con hook DNS disidratato :

certbot \
    --text --agree-tos --email you@example.com \
    --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 

Modalità JSON

Un'altra modalità plug-in è la modalità JSON. Produce un oggetto JSON per riga. Ciò consente un'integrazione più complicata, ad esempio Ansible o un gestore distribuzione sta chiamando certbot. La comunicazione viene eseguita tramite STDOUT e STDIN. Cerbot produce oggetti JSON con dati per eseguire la validazione, ad es.

certbot \
    --text --agree-tos --email you@example.com \
    --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"}

Una volta aggiornato il DNS, il chiamante invia un carattere di nuova riga a STDIN del certbot per segnalare che può continuare con la convalida.

Ciò consente l'automazione e la gestione dei certificati dal server di gestione centrale. Per l'installazione è possibile distribuire certificati tramite SSH.

Per maggiori informazioni, consultare il file Leggimi ed esempi su certbot-external-auth GitHub.

EDIT: c'è anche un nuovo post sul blog che descrive il problema di convalida DNS e l'utilizzo del plugin.

EDIT: attualmente stiamo lavorando sulla convalida in due passaggi Ansible, presto sarà disattivato.


Quando si esegue la migrazione di un sito Web su un altro server, è possibile che si desideri un nuovo certificato prima di passare al record A. È possibile utilizzare il metodo manuale ( certbot certonly --preferred-challenges dns -d example.com) per la richiesta iniziale. Dopo aver testato e cambiato il record A, utilizzare il comune metodo webroot ( certbot certonly webroot -d example.com -w /path/to/webroot) usando esattamente gli stessi nomi di dominio di prima. Se eseguito correttamente, certbot riconoscerà il certificato / la configurazione esistente e aggiornerà le impostazioni di rinnovo, quindi il certificato verrà automaticamente rinnovato in futuro.
marcovtwout,

Funziona, attenzione al firewall AWS a livello EC2
jruzafa,

Sono sicuro di sapere cosa significa --manual-public-ip-logging-ok .... la documentazione è criptica al riguardo e tutti gli esempi là fuori che lo usano non spiegano ... incluso questo.
Rondo,

Il processo di rinnovo richiede ogni volta un nuovo record TXT?
Old Geezer,

1
@Rondo Quando si richiede un certificato utilizzando la modalità manuale in modo interattivo, viene visualizzato questo messaggio "NOTA: l'IP di questa macchina verrà registrato pubblicamente come richiesto questo certificato. Se si esegue certbot in modalità manuale su una macchina che non è il tuo server, assicurati di essere d'accordo. " Questa opzione dice sì a quel prompt.
muru

39

Sono stato in grado di utilizzare il dehydratedclient per ottenere un certificato utilizzando la convalida DNS.

https://github.com/lukas2511/dehydrated

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

Dovrai utilizzare l'hook di convalida DNS corretto per il tuo dominio, ma ci sono alcune opzioni disponibili come esempi:

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


Questo ha funzionato davvero bene per me. L'unica avvertenza che aggiungerei è che ho dovuto installare alcune delle dipendenze gemma definite nello route53.rbscript hook.
jmreicha,

10

Ad oggi, il client ufficiale non supporta il tipo di sfida DNS-01 (ancora).

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

Non l'ho visto, quindi non lo so davvero. La mia comprensione di alto livello era semplicemente "nessun supporto nel nostro client Python per la sfida DNS ancora".

Puoi seguire i progressi in questo PR . In alternativa, ci sono alcuni client che lo supportano già.




3

Come menzionato nelle risposte precedenti, puoi facilmente verificare un dominio tramite DNS con questo:

  1. installa le applicazioni richieste (sotto 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. generare un certificato con conferma sfida DNS manuale per www.esempio.com (sostituirlo con il proprio dominio): ./dehydrated/dehydrated -c -t dns-01 -d www.example.com -k ./dehydrated/hooks /manual/manual_hook.rb

3

Dopo aver provato diverse combinazioni, questo è ciò che ha funzionato per me utilizzando repository git disidratati e che consentono di crittografare manualmente . Se i passaggi seguenti funzionano per te, non dimenticare di aggiungere a stella questi repository

NOTA: questo è in aggiunta alle risposte di panticz.de e 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...

Otterrai un hash (dopo aver eseguito il comando sopra), crea un record TXT nel tuo DNS. Assicurati che funzioni eseguendo il comando seguente o GSuite Toolbox

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

Ora premi Invio al prompt. Questo non ha funzionato per me sebbene il record TXT sia stato aggiornato. Ho dovuto premere Ctrl + C ed eseguire nuovamente il comando.

~$ ./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!
~$

Ora, i tuoi certificati pubblici e privati ​​sono presenti qui.

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

Per rinnovare (il tempo di attesa minimo è di 30 giorni), basta ripetere lo stesso comando.

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

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.