¿Cómo utilizar la validación de desafío Let's Encrypt DNS?

160

Let's Encrypt ha anunciado que tienen:

Activado el soporte para el desafío DNS de ACME

¿Cómo hago para ./letsencrypt-autogenerar un nuevo certificado usando la validación del dominio de desafío DNS?

EDITAR
Quiero decir: ¿Cómo evito el http/httpsenlace de puertos, utilizando la función recientemente anunciada (2015-01-20) que le permite probar la propiedad del dominio agregando un registro TXT específico en la zona DNS del dominio de destino?

Pierre Prinetti
fuente
3
Nota al margen : Certbot (este es el nuevo nombre para el cliente letsencrypt) ahora permite la autenticación basada en webroot por defecto.
Pierre Prinetti

Respuestas:

205

Actualmente es posible realizar una validación de DNS también con el cliente certbot LetsEncrypt en el modo manual. La automatización también es posible (ver más abajo).

Complemento manual

Puede realizar una verificación manual, con el complemento manual.

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

Luego, Certbot le proporcionará instrucciones para actualizar manualmente un registro TXT para el dominio a fin de continuar con la validación.

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

Una vez que haya actualizado el registro DNS, presione Entrar, certbot continuará y si LetsEncrypt CA verifica el desafío, el certificado se emite normalmente.

También puede usar un comando con más opciones para minimizar la interactividad y responder preguntas de certbot. Tenga en cuenta que el complemento manual aún no admite el modo no interactivo.

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

La renovación no funciona con el complemento manual, ya que se ejecuta en modo no interactivo. Más información en la documentación oficial de Certbot .

Actualización: ganchos manuales

En la nueva versión Certbot puede utilizar ganchos , por ejemplo --manual-auth-hook, --manual-cleanup-hook. Los ganchos son scripts externos ejecutados por Certbot para realizar la tarea.

La información se pasa en variables de entorno, por ejemplo, dominio para validar, token de desafío. 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

Puede escribir su propio controlador o utilizar los existentes, hay muchos disponibles, por ejemplo, para Cloudflare DNS.

Más información sobre la documentación oficial de ganchos Certbot

Automatización, Renovación, Scripting

Si desea automatizar la validación de los desafíos de DNS, actualmente no es posible con vanila certbot. Actualización: es posible cierta automatización con los ganchos Certbot.

Por lo tanto, creamos un complemento simple que admite secuencias de comandos con la automatización de DNS. Está disponible como certbot-external-auth .

pip install certbot-external-auth

Es compatible con los métodos de validación DNS, HTTP, TLS-SNI. Puede usarlo en el modo de controlador o en el modo de salida JSON.

Modo de controlador

En el modo de controlador, el complemento certbot + llama a enlaces externos (un programa, script de shell, python, ...) para realizar la validación e instalación. En la práctica, escribe un script simple de controlador / shell que obtiene argumentos de entrada: dominio, token y realiza el cambio en DNS. Cuando finaliza el controlador, certbot continúa con la validación como de costumbre.

Esto le brinda una flexibilidad adicional, la renovación también es posible.

El modo de controlador también es compatible con los enlaces DNS deshidratados (anteriormente letsencrypt.sh). Ya hay muchos enlaces DNS para proveedores comunes (por ejemplo, CloudFlare, GoDaddy, AWS). En el repositorio hay un archivo README con ejemplos extensos y manejadores de ejemplos.

Ejemplo con gancho DNS deshidratado :

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 

Modo JSON

Otro modo de complemento es el modo JSON. Produce un objeto JSON por línea. Esto permite una integración más complicada, por ejemplo, Ansible o algún administrador de implementación llama a certbot. La comunicación se realiza a través de STDOUT y STDIN. Cerbot produce objetos JSON con datos para realizar la validación, por ejemplo,

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"}

Una vez que se actualiza el DNS, la persona que llama envía un carácter de nueva línea a STDIN del certbot para indicar que puede continuar con la validación.

Esto permite la automatización y la administración de certificados desde el servidor de administración central. Para la instalación, puede implementar certificados a través de SSH.

Para obtener más información, consulte el archivo Léame y los ejemplos en certbot-external-auth GitHub.

EDITAR: También hay una nueva publicación de blog que describe el problema de validación de DNS y el uso del complemento.

EDITAR: actualmente trabajamos en la validación de 2 pasos de Ansible, saldremos pronto.

ph4r05
fuente
Al migrar un sitio web a otro servidor, es posible que desee un nuevo certificado antes de cambiar el registro A. Puede usar el método manual ( certbot certonly --preferred-challenges dns -d example.com) para la solicitud inicial. Después de probar y cambiar el registro A, use el método webroot común ( certbot certonly webroot -d example.com -w /path/to/webroot) usando exactamente los mismos nombres de dominio que antes. Si se hace correctamente, certbot reconocerá el certificado / configuración existente y actualizará la configuración de renovación, por lo que el certificado se renovará automáticamente en el futuro.
marcovtwout
Funciona, cuidado con AWS Firewall a nivel EC2
jruzafa
Estoy seguro de que me gustaría saber qué significa --manual-public-ip-logging-ok ... la documentación es críptica al respecto y todos los ejemplos que lo usan no explican ... incluido este.
Rondo
¿El proceso de renovación requiere un nuevo registro TXT cada vez?
Viejo Geezer
1
@Rondo Cuando solicita un certificado utilizando el modo manual de forma interactiva, se muestra este mensaje "NOTA: La IP de esta máquina se registrará públicamente como si hubiera solicitado este certificado. Si está ejecutando certbot en modo manual en una máquina que no su servidor, asegúrese de estar de acuerdo con eso ". Esta opción dice sí a ese aviso.
Muru
39

Pude usar el dehydratedcliente para obtener un certificado mediante la validación de DNS.

https://github.com/lukas2511/dehydrated

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

Deberá usar el enlace de validación de DNS correcto para su dominio, pero hay algunas opciones disponibles como ejemplos:

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

alexcline
fuente
Esto funcionó muy bien para mí. La única advertencia que agregaría es que tuve que instalar algunas de las dependencias de gemas definidas en el route53.rbscript de enlace.
jmreicha
10

A partir de hoy, el cliente oficial no es compatible con el tipo de desafío DNS-01 (todavía).

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

No he mirado esto, así que realmente no lo sé. Mi comprensión de alto nivel era "todavía no hay soporte en nuestro cliente Python para el desafío DNS".

Puedes seguir el progreso en este PR . Alternativamente, hay algunos clientes que ya lo admiten.

Simone Carletti
fuente
3

Como se mencionó en las respuestas anteriores, puede verificar fácilmente un dominio por DNS con esto:

  1. instalar las aplicaciones requeridas (en 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. generar certificado con confirmación manual de desafío DNS para www.example.com (reemplazar con su dominio): ./dehydrated/dehydrated -c -t dns-01 -d www.example.com -k ./dehydrated/hooks /manual/manual_hook.rb
panticz.de
fuente
3

Después de probar diferentes combinaciones, esto es lo que funcionó para mí usando repositorios git deshidratados y letsencrypt-manual-hook . Si los pasos a continuación funcionan para usted, no olvide marcar estos repositorios

NOTA: Esto se suma a las respuestas de panticz.de y 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...

Obtendrá un hash (después de ejecutar el comando anterior), cree un registro TXT en su DNS. Asegúrese de que funciona ejecutando el siguiente comando o GSuite Toolbox

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

Ahora, presione enter en el indicador. Esto no funcionó para mí, aunque se actualizó el registro TXT. Tuve que presionar Ctrl + C y ejecutar el comando nuevamente.

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

Ahora, sus certificados públicos y privados están presentes aquí.

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

Para renovar (el tiempo mínimo de espera es de 30 días), solo el mismo comando nuevamente.

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

Hugo Landau escribió un cliente ACME en Go ( https://github.com/hlandau/acme ) que admite desafíos de DNS (con el protocolo nsupdate de BIND). Me ha funcionado perfectamente durante al menos 18 meses.

Harald
fuente