Wiki CgX

Parce que j'ai un cerveau, mais pas trop.

Outils pour utilisateurs

Outils du site


it:linux-selfhosting:bind:rfc2136

RFC 2136 : Valider un certificat LE en DNS-01

Postulat : On veut créer un certificat wildcard *.domain.tld avec letsencrypt. On a un serveur bind autoritaire sous la main, en local sur la machine.

Etape 1 : créer un accès a bind

  • D'abord on génère une nouvelle clé (si possible dans le répertoire qui va bien /var/cache/bind/keys) :
dnssec-keygen -a HMAC-SHA512 -b 512 -n HOST letsencrypt
  • Ensuite on va récupérer le contenu de la clé dans l'un des fichiers : letsencrypt. IN KEY 512 3 165 6kB<bla bla pleins de trucs>aCA==
  • On va le coller dans le fichier que va utiliser certbot pour accéder a la zone 1) :
/etc/letsencrypt/rfc2136.ini
dns_rfc2136_server = 127.0.0.1
dns_rfc2136_name = letsencrypt
dns_rfc2136_secret = 6kB<bla bla pleins de trucs>aCA==
dns_rfc2136_algorithm = HMAC-SHA512
  • Et on va aussi le coller dans la config de bind :
/etc/bind/named.conf.local
key "letsencrypt" {
    algorithm hmac-sha512;
    secret "6kB<bla bla pleins de trucs>aCA==";
    };
  • Dans le même fichier de config, rajouter l'accès à la zone elle-même :
/etc/bind/named.conf.local
zone "domain.tld" in {
    type master;
    file "domain.tld.named";
    ...
    ...
    check-names ignore;
    update-policy { grant letsencrypt name _acme-challenge.domain.tld. txt; };
    };
  • Et on restart :
    service bind9 restart
  • check-names ignore : Permet a bind de ne pas valider la zone en cas de présence de l'underscore dans _acme-challenge
  • update-policy : Autorise la manipulation de l'entrée _acme-challenge en txt avec la clé letsencrypt

Etape 2 : On teste à vide

Ici, on souhaite générer un certificat pour *.domain.tld mais également pour domain.tld, car il n'est pas compris par défaut dans le wildcard !

On teste une première génération en dry-run :

certbot certonly --dns-rfc2136 --dns-rfc2136-credentials /etc/letsencrypt/rfc2136.ini --dns-rfc2136-propagation-seconds 130 --preferred-challenges=dns --email=letsencrypt@domain.tld --agree-tos -d *.domain.tld -d domain.tld --dry-run
  • –dns-rfc2136-propagation-seconds 130 : Permet d'atterndre le challenge plus longtemps, afin d'être sûr que la propagation aie correctement lieu.

Attention : Le fichier de zone étant modifié directement par bind pour ajouter puis retirer l'enregistrement TXT, il a tendance a mettre le bazar dans la syntaxe du fichier ! Pensez à faire une sauvegarde de votre zone “propre” avant de lancer ces commandes

Ce qui devrait donner à peu près ça :

Saving debug log to /var/log/letsencrypt/letsencrypt.log

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Processing /usr/local/etc/letsencrypt/renewal/domain.tld.conf
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Cert not due for renewal, but simulating renewal for dry run
Plugins selected: Authenticator dns-rfc2136, Installer None
Renewing an existing certificate
Performing the following challenges:
dns-01 challenge for domain.tld
Waiting 5 seconds for DNS changes to propagate
Waiting for verification...
Cleaning up challenges

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
new certificate deployed without reload, fullchain is
/usr/local/etc/letsencrypt/live/domain.tld/fullchain.pem
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
** DRY RUN: simulating 'certbot renew' close to cert expiry
**          (The test certificates below have not been saved.)

Congratulations, all renewals succeeded. The following certs have been renewed:
  /usr/local/etc/letsencrypt/live/domain.tld.com/fullchain.pem (success)
** DRY RUN: simulating 'certbot renew' close to cert expiry
**          (The test certificates above have not been saved.)
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

Etape 3 : On génère vraiment

Même commande que précédemment, mais sans le dry-run :

certbot certonly --dns-rfc2136 --dns-rfc2136-credentials /etc/letsencrypt/rfc2136.ini --dns-rfc2136-propagation-seconds 130 --preferred-challenges=dns --email=letsencrypt@domain.tld --agree-tos -d *.domain.tld -d domain.tld

Si tout se passe bien, vous aurez généré votre certificat wildcard !

Etape 4 : On en fait un cron si besoin

Penser à désactiver les crons systemd de certbot si besoin !

Pas la peine de reprendre toutes les options, en cas de renew :

00      13      *       *       *       /usr/bin/certbot renew --dns-rfc2136-credentials /etc/letsencrypt/rfc2136.ini --dns-rfc2136-propagation-seconds 120
1)
Ici, le serveur bind est local (127.0.0.1), mais on peut mettre autre chose si besoin.
it/linux-selfhosting/bind/rfc2136.txt · Dernière modification : 30 May 2022 :: 12:05 de CgX