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?

Pierre Prinetti
fonte
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 [email protected] -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 [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

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

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.

ph4r05
fonte
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

alexcline
fonte
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.

Simone Carletti
fonte
5

Eu escrevi um script de gancho para o cliente letsencrypt.sh que permite que você use a verificação do DNS Permite criptografar para provedores de DNS que não fornecem uma API para usar (também conhecida como entrada e verificação manuais).

Você pode conferir aqui: https://github.com/jbjonesjr/letsencrypt-manual-hook

J Jones
fonte
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
panticz.de
fonte
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
vikas027
fonte
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.

Harald
fonte