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


Encryptons a annoncé ils ont:

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

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

MODIFIER
Je veux dire: comment puis-je éviter http/https liaison 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?


122
2018-01-21 22:13


origine


Note de côté: Certbot (C'est le nouveau nom du client letsencrypt) permet désormais l'authentification basée sur la racine Web par défaut. - Pierre Prinetti


Réponses:


Actuellement, il est possible d'effectuer une validation DNS également avec le certbot LetsEncrypt client 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 la vérification, 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 you@example.com -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'infos sur le site officiel de Certbot Documentation.

Mise à jour: crochets manuels

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

Les informations sont transmises dans des variables d’environnement, telles que le domaine à valider, le jeton test. 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 déjà existantes. Il en existe de nombreuses autres, par exemple pour le DNS Cloudflare.

Plus d'infos sur le Certbot officiel documentation sur les crochets

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 en tant que 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.

Handler mode est aussi compatible avec Déshydraté Crochets DNS (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 Déshydraté Hook DNS:

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 

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

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 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, bientôt disponible.


154
2017-10-29 13:00



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 / la configuration existant et mettra à jour les paramètres de renouvellement, de sorte que le certificat sera automatiquement renouvelé à l'avenir. - marcovtwout
Cela fonctionne, méfiez-vous du pare-feu AWS 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 d'utilisation 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? - Old Geezer
@OldGeezer Apparemment, c'est le cas. J'ai commencé le processus et il m'a demandé de créer un enregistrement TXT avec un contenu différent de celui de la dernière fois. - Dario Fumagalli


J'ai pu utiliser le dehydrated client 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


37
2018-02-18 21:45



Cela a très bien fonctionné pour moi. La seule réserve que j’ajouterais est que je devais installer quelques-unes des dépendances de gem définies dans la route53.rb crochet script. - jmreicha


À 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 dans notre client Python pour le défi DNS".

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


10
2018-01-28 11:34





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

Vous pouvez le voir ici: https://github.com/jbjonesjr/letsencrypt-manual-hook


5
2018-05-22 16:55





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

3
2017-12-16 10:36





Après avoir essayé différentes combinaisons, c’est ce qui a fonctionné pour moi avec déshydraté et permetencrypt-manual-hook les dépôts git. Si les étapes ci-dessous vous conviennent, n'oubliez pas de étoile 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 SMS enregistrer 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 entrer à 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 même commande.

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

2
2018-02-02 13:44





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


0
2017-07-03 18:07