Comment utiliser la validation du challenge Let's Encrypt DNS?

160

Let's Encrypt a annoncé qu'ils ont:

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

Comment ./letsencrypt-autogénérer un nouveau certificat à l'aide de la validation du domaine de challenge DNS?

EDIT
Je veux dire: Comment éviter la http/httpsliaison de port en utilisant la fonctionnalité récemment 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?

Pierre Prinetti
la source
3
Remarque secondaire: Certbot (nouveau nom du client letsencrypt) autorise désormais l’authentification basée sur la racine Web par défaut.
Pierre Prinetti

Réponses:

205

Il est actuellement 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 donnera ensuite les 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 LetsEncrypt CA vérifie le défi, le certificat est émis normalement.

Vous pouvez également utiliser une commande avec plus d'options pour réduire l'interactivité et répondre aux questions de certbot. Notez que le plugin manuel ne supporte pas encore 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 plugin manuel car il fonctionne en mode non interactif. Plus d'informations dans la documentation officielle de Certbot .

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 des ressources existantes, il en existe beaucoup, par exemple pour le DNS Cloudflare.

Plus d'informations sur la documentation officielle des crochets Certbot

Automatisation, renouvellement, script

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

Nous avons donc créé un plugin simple prenant en charge l’écriture de scripts avec l’automatisation DNS. Il est disponible sous certbot-external-auth .

pip install certbot-external-auth

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

Mode gestionnaire

En mode gestionnaire, le plugin certbot + appelle des points d'ancrage externes (programme, script shell, python, ...) pour effectuer la validation et l'installation. En pratique, vous écrivez un script de gestionnaire / shell simple qui récupère les arguments d'entrée - domaine, jeton et effectue la modification dans DNS. Lorsque le gestionnaire se termine, 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 les points d'ancrage DNS déshydratés (ancien letsencrypt.sh). Il existe déjà de nombreux points d'ancrage DNS pour les fournisseurs courants (par exemple, CloudFlare, GoDaddy, AWS). Le référentiel contient un fichier README avec des exemples détaillés et des exemples de gestionnaires.

Exemple avec un hook DNS déshydraté :

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 complexe - par exemple, Ansible ou un gestionnaire de déploiement appelle certbot. La communication est effectuée via STDOUT et STDIN. Cerbot produit un objet 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 du certbot pour signaler qu'il peut continuer avec 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 via SSH.

Pour plus d'informations, reportez-vous au fichier Lisezmoi et aux exemples de certbot-external-auth GitHub.

EDIT: Il y a aussi un nouvel 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, bientôt disponible.

ph4r05
la source
Lors de la migration d'un site Web vers un autre serveur, vous souhaiterez peut-être un nouveau certificat avant de changer l'enregistrement A. Vous pouvez utiliser la méthode manuelle ( certbot certonly --preferred-challenges dns -d example.com) pour la demande initiale. Après avoir testé et changé l'enregistrement A, utilisez la méthode webroot commune ( certbot certonly webroot -d example.com -w /path/to/webroot) en utilisant exactement le même nom de domaine qu'avant. Si cela est fait correctement, certbot reconnaîtra le certificat / config existant et mettra à jour les paramètres de renouvellement afin que le certificat soit automatiquement renouvelé à l'avenir.
mars
Il fonctionne, Méfiez - vous des AWS pare - feu au niveau EC2
jruzafa
J'aime bien savoir ce que signifie - manual-public-ip-logging-ok ... La documentation est cryptée à ce sujet et tous les exemples qui l'utilisent n'expliquent pas ... y compris celui-ci.
Rondo
Le processus de renouvellement nécessite-t-il un nouvel enregistrement TXT à chaque fois?
Vieux Geezer
1
@Rondo Lorsque vous demandez un certificat utilisant le mode manuel de manière interactive, cette invite s'affiche "REMARQUE: l'adresse IP de cette machine sera publiquement enregistrée comme ayant demandé ce certificat. Si vous exécutez certbot en mode manuel sur une machine qui n'est pas votre serveur, s'il vous plaît assurez-vous que vous êtes d'accord avec ça. " Cette option dit oui à cette invite.
Muru
39

J'ai pu utiliser le dehydratedclient pour obtenir un certificat utilisant 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 hook de validation DNS correct pour votre domaine, mais quelques options sont proposées à titre d'exemple:

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

alexcline
la source
Cela a très bien fonctionné pour moi. La seule réserve que je voudrais ajouter est que je devais installer quelques-unes des dépendances de gem définies dans le route53.rbscript de raccordement.
Jmreicha
10

À 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 simplement "pas encore de support de notre client Python pour le challenge DNS".

Vous pouvez suivre les progrès à ce PR . Alternativement, certains clients le prennent déjà en charge.

Simone Carletti
la source
5

J'ai écrit un script de raccordement pour le client letsencrypt.sh qui vous permet d'utiliser la vérification Lets Encrypt DNS pour les fournisseurs DNS qui ne fournissent pas une API à utiliser (autrement dit, une saisie manuelle et une vérification sont requises).

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

J Jones
la source
3

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 du challenge 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
panticz.de
la source
3

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

NOTE: Ceci est en plus des 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 enregistrement TXT 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 Entrée à l'invite. Cela n'a pas fonctionné pour moi bien que l'enregistrement TXT ait été mis à jour. Je devais 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 concerts 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 délai d’attente minimum est de 30 jours), reprenez la commande.

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

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.

Harald
la source