Comment obtenir un certificat Let’s Encrypt en utilisant la validation DNS avec acme-dns-certbot sur Ubuntu 18.04

L’auteur a choisi le Fonds d’aide COVID-19 pour recevoir un don en tant que partie du programme Write for DOnations.

Introduction

La plupart des certificats de Let’s Encrypt sont émis en utilisant la validation HTTP, ce qui permet une installation facile de certificats sur un seul serveur. Cependant, la validation HTTP n’est pas toujours appropriée pour émettre des certificats destinés à des sites Web répartis sur un équilibreur de charge, ni pour émettre des certificats génériques.

La validation DNS permet de vérifier les demandes d’émission de certificats en utilisant des enregistrements DNS plutôt que de servir du contenu via HTTP. Cela signifie que les certificats peuvent être émis simultanément pour un cluster de serveurs Web derrière un équilibreur de charge, ou pour un système non directement accessible depuis Internet. La validation DNS permet également l’émission de certificats génériques.

L’outil acme-dns-certbot est utilisé pour connecter Certbot à un serveur DNS tiers où les enregistrements de validation du certificat peuvent être définis automatiquement via une API lors de la demande de certificat. L’avantage de cela est que vous n’avez pas besoin d’intégrer Certbot directement à votre compte de fournisseur de DNS, ni de lui accorder un accès illimité à votre configuration DNS complète, ce qui est bénéfique à la sécurité.

Les zones DNS déléguées sont utilisées afin de rediriger les recherches pour les enregistrements de validation du certificat vers le service DNS tiers, donc une fois que la configuration initiale est terminée, vous pouvez demander autant de certificats que vous le souhaitez sans avoir à effectuer de validation manuelle.

Un autre avantage important d’acme-dns-certbot est qu’il peut être utilisé pour émettre des certificats pour des serveurs individuels qui pourraient être derrière un équilibreur de charge ou sont autrement non accessibles directement via HTTP. La validation traditionnelle des certificats HTTP ne peut pas être utilisée dans de tels cas, à moins que vous ne définissiez les fichiers de validation sur chaque serveur. L’outil acme-dns-certbot est également utile si vous souhaitez émettre un certificat pour un serveur qui n’est pas accessible sur Internet, comme un système interne ou un environnement de préproduction.

Dans ce tutoriel, vous utiliserez l’hook acme-dns-certbot pour Certbot pour émettre un certificat Let’s Encrypt en utilisant la validation DNS.

Prérequis

Pour terminer ce tutoriel, vous aurez besoin de :

  • Un serveur Ubuntu 18.04 configuré en suivant la Configuration initiale du serveur avec Ubuntu 18.04, y compris un utilisateur non-root avec sudo.

  • Un nom de domaine pour lequel vous pouvez acquérir un certificat TLS, y compris la possibilité d’ajouter des enregistrements DNS. Dans cet exemple particulier, nous utiliserons your-domain et subdomain.your-domain, ainsi que *.your-domain pour un certificat générique. Cependant, cela peut être ajusté pour d’autres domaines, sous-domaines ou wildcards si nécessaire.

Une fois que vous avez tout prêt, connectez-vous à votre serveur en tant qu’utilisateur non-root pour commencer.

Étape 1 — Installation de Certbot

Dans cette étape, vous installeriez Certbot, un programme utilisé pour émettre et gérer des certificats Let’s Encrypt.

Certbot est disponible dans les dépôts officiels Ubuntu Apt, cependant, il est plutôt recommandé d’utiliser le dépôt maintenu par les développeurs de Certbot, car celui-ci contient toujours la version la plus à jour du logiciel.

Commencez par ajouter le dépôt Certbot :

sudo apt-add-repository ppa:certbot/certbot

Vous devrez appuyer sur ENTRER pour accepter l’invite et ajouter le nouveau dépôt à votre système.

Ensuite, installez le paquet Certbot :

sudo apt install certbot

Une fois l’installation complétée, vous pouvez vérifier que Certbot a été installé avec succès :

certbot --version

Cela affichera quelque chose de similaire à ce qui suit :

Output
certbot 0.31.0

Dans cette étape, vous avez installé Certbot. La prochaine étape consiste à télécharger et installer l’onglet acme-dns-certbot.

Étape 2 — Installation d’acme-dns-certbot

Maintenant que le programme de base Certbot est installé, vous pouvez télécharger et installer acme-dns-certbot, qui permettra à Certbot de fonctionner en mode de validation DNS.

Démarrez en téléchargeant une copie du script :

Note : En tant que meilleure pratique, veuillez s’assurer de réviser ce dépôt GitHub et le script avant de l’exécuter. Vous pouvez également first fork ce dépôt et puis utilisez le script acme-dns-certbot.py. Ce fork offre une couche supplémentaire de sécurité, garantissant que le script reste sous notre contrôle et est moins susceptible d’être touché par des modifications non vérifiées.

wget https://github.com/joohoi/acme-dns-certbot-joohoi/raw/master/acme-dns-auth.py

Une fois le téléchargement terminé, marquez le script comme exécutable :

chmod +x acme-dns-auth.py

Ensuite, éditez le fichier à l’aide de votre éditeur de texte favori et ajustez la première ligne afin de le forcer à utiliser Python 3 :

nano acme-dns-auth.py

Ajoutez un 3 à la fin de la première ligne :

acme-dns-certbot.py
#!/usr/bin/env python3
. . .

Cela est nécessaire afin d’assurer que le script utilise la dernière version supportée de Python 3, plutôt que la version légacy de Python 2.

Une fois terminé, enregistrez et fermez le fichier.

Enfin, déplacez le script vers le répertoire Certbot Let’s Encrypt afin que Certbot puisse le charger :

sudo mv acme-dns-auth.py /etc/letsencrypt/

A cette étape, vous avez téléchargé et installé l’hook acme-dns-certbot. Ensuite, vous pouvez commencer le processus de configuration et travailler vers l’émission de votre premier certificat.

Étape 3 — Configuration d’acme-dns-certbot

Pour commencer à utiliser acme-dns-certbot, vous devez effectuer un processus d’installation initial et émettre au moins un certificat.

Démarrez en exécutant Certbot pour le forcer à émettre un certificat en utilisant la validation DNS. Cela exécutera le script acme-dns-certbot et déclenchera le processus d’installation initial :

sudo certbot certonly --manual --manual-auth-hook /etc/letsencrypt/acme-dns-auth.py --preferred-challenges dns --debug-challenges -d \*.your-domain -d your-domain

Vous utilisez l’argument --manual pour désactiver toutes les fonctionnalités d’intégration automatisées de Certbot. Dans ce cas, vous n’émettez qu’un certificat brut, plutôt que d’installer automatiquement le certificat sur un service.

Vous configurez Certbot pour utiliser l’hook acme-dns-certbot via l’argument --manual-auth-hook. Vous exécutez l’argument --preferred-challenges afin que Certbot privilégie la validation DNS.

Vous devez également indiquer à Certbot de mettre en pause avant de tenter de valider le certificat, ce que vous faites avec l’argument --debug-challenges. Cela permet de vous donner le temps de définir les enregistrements DNS CNAME requis par acme-dns-certbot, ce qui est abordé plus loin dans cette étape. Sans l’argument --debug-challenges, Certbot ne mettrait pas en pause, vous n’aurez donc pas le temps de faire la modification DNS requise.

N’oubliez pas de remplacer chacun des noms de domaine que vous souhaitez utiliser en utilisant les arguments -d. Si vous souhaitez émettre un certificat général, veillez à échapper l’astérisque (*) avec un backslash (\).

Après avoir suivi les étapes standard de Certbot, vous serez finalement invité à une message similaire au suivant :

Output
... Output from acme-dns-auth.py: Please add the following CNAME record to your main DNS zone: _acme-challenge.your-domain CNAME a15ce5b2-f170-4c91-97bf-09a5764a88f6.auth.acme-dns.io. Waiting for verification... ...

Vous devrez ajouter le enregistrement DNS CNAME requis à la configuration DNS de votre domaine. Cela permettra de déléguer le contrôle du sous-domaine _acme-challenge au service DNS ACME, qui permettra à acme-dns-certbot de définir les enregistrements DNS requis pour valider la demande de certificat.

Si vous utilisez DigitalOcean comme fournisseur de DNS, vous pouvez définir l’enregistrement DNS dans votre tableau de bord :

Il est recommandé de définir le TTL (temps de validité) à environ 300 secondes afin de veiller à ce que tout changement dans l’enregistrement soit propagé rapidement.

Une fois que vous avez configuré l’enregistrement DNS, retournez à Certbot et appuyez sur ENTRER pour valider la demande de certificat et terminer le processus d’émission.

Cela prendra quelques secondes, et vous verrez ensuite un message confirmant que le certificat a été émis :

Output
... Congratulations! Your certificate and chain have been saved at: /etc/letsencrypt/live/your-domain/fullchain.pem Your key file has been saved at: /etc/letsencrypt/live/your-domain/privkey.pem ...

Vous avez exécuté acme-dns-certbot pour la première fois, configuré les enregistrements DNS requis et émis un certificat avec succès. Par la suite, vous configurerez les renouvellements automatiques de votre certificat.

Étape 4 — Utiliser acme-dns-certbot

Dans cette dernière étape, vous utiliserez acme-dns-certbot pour émettre plus de certificats et renouveler les certificats existants.

Tout d’abord, maintenant que vous avez émis avec succès au moins un certificat en utilisant acme-dns-certbot, vous pouvez continuer à émettre des certificats pour les mêmes noms de domaine DNS sans avoir à ajouter un autre enregistrement DNS CNAME. Cependant, si vous souhaitez obtenir un certificat pour un sous-domaine différent ou pour un nouveau domaine entier, vous serez invité à ajouter un autre enregistrement CNAME pour le sous-domaine.

Par exemple, vous pouvez émettre un certificat général wildcard indépendant sans devoir recommencer la vérification :

sudo certbot certonly --manual --manual-auth-hook /etc/letsencrypt/acme-dns-auth.py --preferred-challenges dns --debug-challenges -d \*.your-domain

Cependant, si vous essayiez d’émettre un certificat pour un sous-domaine, vous serez invité à ajouter un enregistrement CNAME pour le sous-domaine :

sudo certbot certonly --manual --manual-auth-hook /etc/letsencrypt/acme-dns-auth.py --preferred-challenges dns --debug-challenges -d subdomain.your-domain

Cela affichera une sortie similaire à l’installation initiale que vous avez effectuée à l’étape 3 :

Output
... Please add the following CNAME record to your main DNS zone: _acme-challenge.subdomain.your-domain CNAME 8450fb54-8e01-4bfe-961a-424befd05088.auth.acme-dns.io. Waiting for verification... ...

Maintenant que vous pouvez utiliser acme-dns-certbot pour émettre des certificats, il est worth envisager le processus de renouvellement également.

Une fois que vos certificats se rapprochent de l’expiration, Certbot peut les renouveler automatiquement pour vous :

sudo certbot renew

Le processus de renouvellement peut s’exécuter de A à Z sans interaction de l’utilisateur, et il se rappellera toutes les options de configuration que vous avez spécifiées lors de l’installation initiale.

Pour tester que ceci fonctionne sans avoir à attendre jusqu’à la date d’expiration, vous pouvez déclencher un test de simulation. Cela simulera le processus de renouvellement sans faire aucune modification réelle à votre configuration.

Vous pouvez déclencher un test de simulation en utilisant la commande standard renew, mais en ajoutant l’argument --dry-run :

sudo certbot renew --dry-run

Cela affichera quelque chose d’approximativement similaire au message suivant, ce qui fournit une assurance que le processus de renouvellement fonctionne correctement :

Output
... Cert not due for renewal, but simulating renewal for dry run Plugins selected: Authenticator manual, Installer None Renewing an existing certificate Performing the following challenges: dns-01 challenge for your-domain dns-01 challenge for your-domain Waiting for verification... Cleaning up challenges ...

Dans cette dernière étape, vous avez émis un autre certificat et ensuite testé le processus de renouvellement automatique dans Certbot.

Conclusion

Dans cet article, vous avez configuré Certbot avec acme-dns-certbot pour émettre des certificats en utilisant la validation par DNS. Cela permet d’utiliser les certificats wildcard ainsi que la gestion d’un grand parc de serveurs Web distincts qui pourraient être derrière un équilibreur de charge.

Assurez-vous de surveiller le référentiel acme-dns-certbot pour toute mise à jour du script, car il est toujours recommandé de faire fonctionner la version la plus récente supportée.

Si vous êtes intéressé(e) à en apprendre davantage sur acme-dns-certbot, vous pourriez souhaiter revoir la documentation du projet acme-dns, qui est l’élément serveur du acme-dns-certbot :

Le logiciel acme-dns peut également être hébergé en interne, ce qui pourrait être avantageux si vous opérez dans un environnement à haute sécurité ou complexe.

De manière alternative, vous pourriez enquêter sur les détails techniques de la validation DNS ACME en examinant la section pertinente du document officiel RFC qui décrit la manière dont le processus fonctionne :

Source:
https://www.digitalocean.com/community/tutorials/how-to-acquire-a-let-s-encrypt-certificate-using-dns-validation-with-acme-dns-certbot-on-ubuntu-18-04