Créer ou renouveler un certificat Let’s Encrypt avec la méthode DNS challenge

Certbot (Let’s Encrypt) a révolutionné et démocratisé l’utilisation du protocole HTTPS avec ses certificats gratuits. J’en avais déjà parlé notament dans l’article Renouveler un certificat SSL Let’s encrypt avec le plugin Webroot. La méthode utilisée dans l’article possède au moins un inconvénient en ce qui me concerne, si un des domaines ou sous-domaines n’a pas de document root – par exemple c’est un domaine redirigé – alors il n’est pas possible de renouveler le certificat car Certbot doit écrire à la racine de l’hébergement du domaine dans un répertoire .well-known, qui n’existe pas pour ce genre de cas.

La méthode DNS challenge

Pour palier à cela, je me suis penché sur la vérification par DNS que propose Certbot. Voici la syntaxe que j’utilise avec quelques options bien utiles :

certbot \
     --text \
     --agree-tos \
     --email postmaster@domaine.net \
     -d domaine.net \
     -d www.domaine.net \
     -d admin.domaine.net \
     -d outils.domaine.net \
     --manual \
     --preferred-challenges dns \
     --expand \
     --renew-by-default \
     --manual-public-ip-logging-ok \
     certonly

La première fois, Certbot va vous demander d’ajouter un ou plusieurs nouveaux enregistrements DNS de type TXT avec des messages de la sorte :

Please deploy a DNS TXT record under the name
_acme-challenge.www.domaine.net with the following value:

01q03R1jl4gen_8souu4Ki1kbnfEaJJ7JIjP_eG12nU

Before continuing, verify the record is deployed.

Lorsque c’est fait, il suffit d’appuyer sur entrée pour continuer et le renouvellement du certificat va se poursuivre.


Waiting for verification...
Cleaning up challenges

IMPORTANT NOTES:
 - Congratulations! Your certificate and chain have been saved at:
   /etc/letsencrypt/live/www.domaine.net/fullchain.pem
   Your key file has been saved at:
   /etc/letsencrypt/live/www.domaine.net/privkey.pem
   Your cert will expire on 2018-01-01. To obtain a new or tweaked
   version of this certificate in the future, simply run certbot
   again. To non-interactively renew *all* of your certificates, run
   "certbot renew"
 - If you like Certbot, please consider supporting our work by:

   Donating to ISRG / Let's Encrypt:   https://letsencrypt.org/donate
   Donating to EFF:                    https://eff.org/donate-le

Erreur urn:acme:error:connection lors du renouvellement d’un certificat Certbot

Vous avez un certificat Certbot (Let’s Encrypt) que vous renouvelez toujours sans problème tous les 90 jours, et récemment une erreur du type de celle ci-dessous survient alors que votre serveur fonctionne normalement.

Failed authorization procedure. mon.domaine.net (http-01): urn:acme:error:connection :: The server could not connect to the client to verify the domain :: Could not connect to mon-domaine.net

Il y a des dizaines et des dizaines de publications sur ce message d’erreur, qui logiquement renvoient vers des problèmes d’accessibilité au serveur (DNS) ou aux fichiers de celui-ci (permissions). D’ailleurs Certbot vous donne des indices dans ce sens :

To fix these errors, please make sure that your domain name was
 entered correctly and the DNS A record(s) for that domain
 contain(s) the right IP address. Additionally, please check that
 your computer has a publicly routable IP address and that no
 firewalls are preventing the server from communicating with the
 client. If you're using the webroot plugin, you should also verify
 that you are serving files from the webroot path you provided.

Mais comme dans mon cas, tout était fonctionnel.

IPv4 et IPv6

Après des heures à chercher et trifouiller ma configuration, je me suis rendu compte qu’un telnet mon.domaine.net 80 faisait déjà une résolution sur l’IPv6 de mon domaine avant de passer en IPv4. J’ai donc cherché dans ce sens et découvert que depuis peu Certbot privilégie IPv6 si un enregistrement DNS de type AAAA existe pour le domaine, ce qui était mon cas.

J’ai supprimé l’enregistrement AAAA (ce n’est peut-être pas le plus préférable, mais pour l’instant je m’en contente), et le renouvellement s’est bien déroulé avec succès.