Como usar a validação de desafio do Let's Encrypt DNS?


160

Vamos Criptografar anunciou que eles têm:

Suporte ativado para o desafio DNS da ACME

Como faço para ./letsencrypt-autogerar um novo certificado usando a validação de domínio de desafio do DNS?

EDIT
Quero dizer: como evitar a http/httpsligação de porta, usando o recém-anunciado recurso (2015-01-20) que permite provar a propriedade do domínio adicionando um registro TXT específico na zona DNS do domínio de destino?


3
Nota lateral: Certbot (este é o novo nome para o cliente letsencrypt) agora permite autenticação baseada em webroot por padrão.
Pierre Prinetti

Respostas:


204

Atualmente, é possível executar uma validação de DNS também com o cliente LetsEncrypt do certbot no modo manual. A automação também é possível (veja abaixo).

Plug-in manual

Você pode executar uma verificação manual - com o plug-in manual.

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

O Certbot fornecerá instruções para atualizar manualmente um registro TXT para o domínio para prosseguir com a validação.

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

Depois de atualizar o registro DNS, pressione Enter, o certbot continuará e se o LetsEncrypt CA verificar o desafio, o certificado será emitido normalmente.

Você também pode usar um comando com mais opções para minimizar a interatividade e responder a perguntas do certbot. Observe que o plug-in manual ainda não suporta o modo não interativo.

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

A renovação não funciona com o plug-in manual, pois é executado no modo não interativo. Mais informações na documentação oficial do Certbot .

Atualização: ganchos manuais

Na nova versão Certbot você pode usar ganchos , por exemplo --manual-auth-hook, --manual-cleanup-hook. Os ganchos são scripts externos executados pelo Certbot para executar a tarefa.

As informações são passadas em variáveis ​​de ambiente - por exemplo, domínio para validar, desafiar o 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

Você pode escrever seu próprio manipulador ou usar já existente; existem muitos disponíveis, por exemplo, para Cloudflare DNS.

Mais informações sobre a documentação oficial dos ganchos Certbot

Automação, Renovação, Script

Se você deseja automatizar a validação de desafios de DNS, atualmente não é possível com o vanila certbot. Atualização: é possível alguma automação com os ganchos Certbot.

Assim, criamos um plugin simples que suporta scripts com automação de DNS. Está disponível como certbot-external-auth .

pip install certbot-external-auth

Ele suporta métodos de validação DNS, HTTP, TLS-SNI. Você pode usá-lo no modo manipulador ou no modo de saída JSON.

Modo manipulador

No modo manipulador, o plug-in certbot + chama ganchos externos (um programa, shell script, python, ...) para executar a validação e instalação. Na prática, você escreve um script manipulador / shell simples que obtém argumentos de entrada - domínio, token e faz a alteração no DNS. Quando o manipulador termina, o certbot continua com a validação como de costume.

Isso oferece uma flexibilidade extra, a renovação também é possível.

O modo manipulador também é compatível com os ganchos DNS desidratados (anteriormente letsencrypt.sh). Já existem muitos ganchos de DNS para provedores comuns (por exemplo, CloudFlare, GoDaddy, AWS). No repositório, há um README com extensos exemplos e manipuladores de exemplo.

Exemplo com gancho DNS desidratado :

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 

Modo JSON

Outro modo de plug-in é o modo JSON. Produz um objeto JSON por linha. Isso permite uma integração mais complicada - por exemplo, o Ansible ou algum gerenciador de implementação está chamando certbot. A comunicação é realizada via STDOUT e STDIN. Cerbot produz objeto JSON com dados para executar a validação, por exemplo,

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

Depois que o DNS é atualizado, o chamador envia um caractere de nova linha para STDIN do certbot para sinalizar que ele pode continuar com a validação.

Isso permite o gerenciamento de automação e certificado no servidor de gerenciamento central. Para instalação, você pode implantar certificados pelo SSH.

Para mais informações, consulte o leia-me e exemplos no GitHub certbot-external-auth .

EDIT: Há também uma nova postagem no blog descrevendo o problema de validação de DNS e o uso do plug-in.

EDIT: atualmente trabalhamos na validação em duas etapas do Ansible, que será desativada em breve.


Ao migrar um site para outro servidor, você pode desejar um novo certificado antes de mudar o registro A. Você pode usar o método manual ( certbot certonly --preferred-challenges dns -d example.com) para a solicitação inicial. Após testar e alternar o registro A, use o método webroot comum ( certbot certonly webroot -d example.com -w /path/to/webroot) usando exatamente o mesmo nome de domínio que antes. Se feito corretamente, o certbot reconhecerá o certificado / configuração existente e atualizará as configurações de renovação, para que o certificado seja renovado automaticamente no futuro.
Marcovtwout

Ele funciona, Cuidado com AWS Firewall a nível EC2
jruzafa

Eu com certeza gostaria de saber o que significa --manual-public-ip-logging-ok .... a documentação é enigmática e todos os exemplos que o utilizam não explicam ... incluindo este.
Rondo

O processo de renovação requer um novo registro TXT a cada vez?
Old Geezer

1
@Rondo Quando você solicita um certificado usando o modo manual interativamente, este prompt é exibido "NOTA: O IP desta máquina será registrado publicamente como tendo solicitado este certificado. Se você estiver executando o certbot no modo manual em uma máquina que não seja seu servidor, verifique se você concorda com isso. " Esta opção diz sim a esse prompt.
muru

39

Consegui usar o dehydratedcliente para obter um certificado usando a validação de DNS.

https://github.com/lukas2511/dehydrated

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

Você precisará usar o gancho de validação de DNS correto para o seu domínio, mas existem algumas opções disponíveis como exemplos:

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


Isso funcionou muito bem para mim. A única ressalva que eu acrescentaria é que tive que instalar algumas das dependências de gem definidas no route53.rbscript do gancho.
jmreicha

10

Atualmente, o cliente oficial ainda não suporta o tipo de desafio DNS-01.

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

Eu não olhei para isso, então realmente não sei. Meu entendimento de alto nível era apenas "ainda não há suporte em nosso cliente Python para o desafio do DNS".

Você pode acompanhar o progresso neste PR . Como alternativa, existem alguns clientes que já o suportam.




3

Conforme mencionado nas respostas anteriores, você pode facilmente verificar um domínio pelo DNS com isso:

  1. instale os aplicativos necessários (no 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. gere certificado com confirmação manual de desafio de DNS para www.example.com (substitua pelo seu domínio): ./dehydrated/dehydrated -c -t dns-01 -d www.example.com -k ./dehydrated/hooks /manual/manual_hook.rb

3

Depois de tentar combinações diferentes, foi isso que funcionou para mim usando os repositórios git desidratado e letsencrypt-manual-hook . Se as etapas abaixo funcionarem para você, não esqueça de colocar uma estrela nesses repositórios

NOTA: Além das respostas de 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...

Você obterá um hash (depois de executar o comando acima), crie um registro TXT no seu DNS. Verifique se ele funciona executando o comando abaixo ou o GSuite Toolbox

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

Agora, pressione enter no prompt. Isso não funcionou para mim, embora o registro TXT tenha sido atualizado. Eu tive que pressionar Ctrl + C e executar o comando novamente.

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

Agora, seus certificados públicos e privados estão presentes aqui.

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

Para renovar (o tempo de espera mínimo é de 30 dias), apenas o mesmo comando novamente.

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

1

Hugo Landau escreveu um cliente ACME no Go ( https://github.com/hlandau/acme ) que suporta desafios de DNS (com o protocolo nsupdate do BIND). Ele está funcionando perfeitamente para mim há pelo menos 18 meses.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.