web-dev-qa-db-fra.com

Comment utiliser la validation de défi DNS Let's Encrypt?

Let's Encrypt a annoncé ils ont:

Activation de la prise en charge du défi DNS ACME

Comment puis-je faire ./letsencrypt-auto générer un nouveau certificat à l'aide de la validation du domaine de défi DNS?

[~ # ~] modifier [~ # ~]
Je veux dire: comment puis-je éviter http/https liaison de port, en utilisant la nouvelle fonctionnalité annoncée (2015-01-20) qui vous permet de prouver la propriété du domaine en ajoutant un enregistrement TXT spécifique dans la zone DNS du domaine cible?

174
Pierre Prinetti

Actuellement, il est possible d'effectuer une validation DNS, également avec le client certbot LetsEncrypt en mode manuel. L'automatisation est également possible (voir ci-dessous).

Plugin manuel

Vous pouvez soit effectuer une vérification manuelle - avec le plugin manuel.

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

Certbot vous fournira ensuite des instructions pour mettre à jour manuellement un enregistrement TXT pour le domaine afin de procéder à la validation.

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

Une fois que vous avez mis à jour l'enregistrement DNS, appuyez sur Entrée, certbot continuera et si l'autorité de certification LetsEncrypt vérifie le défi, le certificat est émis normalement.

Vous pouvez également utiliser une commande avec plus d'options pour minimiser l'interactivité et répondre aux questions de certbot. Notez que le plugin manuel ne prend pas encore en charge le mode non interactif.

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

Le renouvellement ne fonctionne pas avec le plug-in manuel car il s'exécute en mode non interactif. Plus d'informations dans le certbot officiel documentation .

Mise à jour: crochets manuels

Dans la nouvelle version de certbot, vous pouvez utiliser des crochets , par exemple, --manual-auth-hook, --manual-cleanup-hook. Les hooks sont des scripts externes exécutés par certbot pour effectuer la tâche.

Les informations sont transmises dans des variables d'environnement - par exemple, domaine à valider, jeton de défi. 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

Vous pouvez écrire votre propre gestionnaire ou utiliser ceux déjà existants. Il existe de nombreux logiciels disponibles, par exemple, pour Cloudflare DNS.

Plus d'informations sur certbot officiel documentation des crochets .

Automatisation, renouvellement, script

Si vous souhaitez automatiser la validation des défis DNS, cela n'est actuellement pas possible avec Vanilla certbot. Mise à jour: une certaine automatisation est possible avec les hooks certbot.

Nous avons donc créé un plugin simple qui prend en charge les scripts avec l'automatisation DNS. Il est disponible sous la forme certbot-external-auth .

pip install certbot-external-auth

Il prend en charge les méthodes de validation DNS, HTTP, TLS-SNI. Vous pouvez soit l'utiliser en mode gestionnaire ou en mode de sortie JSON.

Mode gestionnaire

En mode gestionnaire, le plugin certbot + appelle des hooks externes (un programme, un script Shell, Python, ...) pour effectuer la validation et l'installation. En pratique, vous écrivez un simple gestionnaire/script Shell qui obtient les arguments d'entrée - domaine, jeton et effectue la modification dans DNS. Lorsque le gestionnaire a terminé, certbot procède à la validation comme d'habitude.

Cela vous donne une flexibilité supplémentaire, le renouvellement est également possible.

Le mode gestionnaire est également compatible avec déshydraté hooks DNS (anciennement letsencrypt.sh). Il existe déjà de nombreux hooks DNS pour les fournisseurs courants (par exemple, CloudFlare, GoDaddy, AWS). Dans le référentiel, il y a un README avec des exemples détaillés et des exemples de gestionnaires.

Exemple avec déshydraté hook DNS:

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 

Mode JSON

Un autre mode de plugin est le mode JSON. Il produit un objet JSON par ligne. Cela permet une intégration plus compliquée - par exemple, lorsque Ansible ou un gestionnaire de déploiement appelle certbot. La communication s'effectue via STDOUT et STDIN. Cerbot produit des objets JSON avec des données pour effectuer la validation, par exemple:

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

Une fois le DNS mis à jour, l'appelant envoie le caractère de nouvelle ligne à STDIN de certbot pour signaler qu'il peut poursuivre la validation.

Cela permet l'automatisation et la gestion des certificats à partir du serveur de gestion central. Pour l'installation, vous pouvez déployer des certificats sur SSH.

Pour plus d'informations, reportez-vous au fichier Lisez-moi et aux exemples sur certbot-external-auth GitHub.

EDIT: Il y a aussi un nouveau article de blog décrivant le problème de validation DNS et l'utilisation du plugin.

EDIT: Nous travaillons actuellement sur la validation Ansible en 2 étapes, sera bientôt désactivé.

228
ph4r05

J'ai pu utiliser le client dehydrated pour obtenir un certificat à l'aide de la validation DNS.

https://github.com/lukas2511/dehydrated

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

Vous devrez utiliser le bon crochet de validation DNS pour votre domaine, mais quelques options sont disponibles à titre d'exemples:

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

39
alexcline

À ce jour, le client officiel ne prend pas (encore) en charge le type de défi DNS-01.

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

Je n'ai pas regardé ça donc je ne sais pas vraiment. Ma compréhension de haut niveau était tout simplement "pas de support dans notre Python pour le défi DNS pour le moment").

Vous pouvez suivre les progrès sur ce PR . Alternativement, il y a certains clients qui le supportent déjà.

10
Simone Carletti

J'ai écrit un script de hook pour le letsencrypt.sh client qui vous permet d'utiliser la vérification DNS Lets Encrypt pour les fournisseurs DNS qui ne ne fournissez pas d'api à utiliser (c'est-à-dire que la saisie et la vérification manuelles sont requises).

Vous pouvez le vérifier ici: https://github.com/jbjonesjr/letsencrypt-manual-hook

5
J Jones

Comme mentionné dans les réponses précédentes, vous pouvez facilement vérifier un domaine par DNS avec ceci:

  1. installer les applications requises (sous 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. générer un certificat avec confirmation manuelle de défi DNS pour www.example.com (remplacer par votre domaine): ./dehydrated/dehydrated -c -t dns-01 -d www.example.com -k ./dehydrated/hooks /manual/manual_hook.rb
3
panticz.de

Après avoir essayé différentes combinaisons, c'est ce qui a fonctionné pour moi en utilisant déshydraté et letsencrypt-manual-hook git repositories. Si les étapes ci-dessous vous conviennent, n'oubliez pas de star ces référentiels

NOTE: Ceci s'ajoute aux réponses de panticz.de et 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...

Vous obtiendrez un hachage (après avoir exécuté la commande ci-dessus), créez un [~ # ~] txt [~ # ~] enregistrement dans votre DNS. Assurez-vous que cela fonctionne en exécutant la commande ci-dessous ou GSuite Toolbox

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

Maintenant, appuyez sur enter à l'invite. Cela n'a pas fonctionné pour moi bien que l'enregistrement TXT ait été mis à jour. J'ai dû appuyer sur Ctrl + C et réexécuter la commande.

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

Maintenant, vos certificats publics et privés sont présents ici.

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

Pour renouveler (le temps d'attente minimum est de 30 jours), répétez la même commande.

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

Hugo Landau a écrit un client ACME dans Go ( https://github.com/hlandau/acme ) qui prend en charge les défis DNS (avec le protocole nsupdate de BIND). Cela fonctionne parfaitement pour moi depuis au moins 18 mois.

1
Harald

Il est assez facile à réaliser lorsque vous utilisez --manual-auth-hook et --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`

auth.sh serait quelque chose comme

#!/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

et cleanup.sh quelque chose comme

#!/bin/sh

KEYFILE=/opt/certbot-authenticator/tsig

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

à condition que votre serveur DNS soit correctement configuré pour autoriser les mises à jour DNS dynamiques (RFC2136). L'utilisation d'une clé TSIG est fortement conseillée, mais si vous choisissez de ne pas l'utiliser, coupez simplement le -k $KEYFILE option lors de l'appel de nsupdate.

0
karlsebal