L’objetif est de générer automatiquement ses certificats Let’s Encrypt avec Certbot. Le scénario est le suivant :
- Certbot initie une demande
- Let’s Encrypt initie le Request Challenge
- Certbot met à jour Bind afin d’etre pret pour le Request Challenge
- Certbot informe à Let’s Encrypt que c’est prêt
- Let’s Encrypt verifie l’enregistrement DNS
- Let’s Encrypt fourni nos nouveaux certificat

Prerequis:
- Avoir installé certbot
- Avoir un serveur bind fonctionnel, le service est exécuté de préférence par un utilisateur spécifique, ex « bind ».
Point d’attention
Tester avec une seule clé nommée « tsig-key ».
Bind
Intégration
Générer les clés et on s’assure que les fichiers sont lisibles par l’utilisateur bind.
tsig-keygen -a hmac-sha512 tsig-key > /etc/bind/tsig.key
tsig-keygen -a hmac-sha512 tsig-key > /etc/bind/rndc.key
chown bind: /etc/bind/tsig.key
chown bind: /etc/bind/rndc.key
Les clés générées sont au format suivant :
key "tsig-key" {
algorithm hmac-sha512;
secret "secret==";
};
Partie à ajouter dans named.conf.local :
include "/etc/bind/tsig.key";
zone "integ.tk" IN {
update-policy {
grant tsig-key name _acme-challenge.www.integ.tk. TXT;
grant tsig-key name _acme-challenge.integ.tk. TXT;
};
type master;
file "/etc/bind/db.integ.tk";
};
Test
On test la commande suivante en local afin de vérifier si la mise à jour fonctionne.
KEYFILE=/etc/bind/tsig.key
nsupdate -d -k $KEYFILE <<EOT
server ns1.integ.tk
zone integ.tk.
update add _acme-challenge.www.integ.tk. 10 txt yellow
send
EOT

Certbot
En suivant cette page https://certbot.eff.org/docs/using.html#pre-and-post-validation-hooks, il va nous falloir 2 scripts (auth et clean) afin que certbot met à jour par les « hooks » de son script les infos DNS demandées.
Les variables sont passées à chacun des 2 scripts par certbot:
CERTBOT_DOMAIN: The domain being authenticated
CERTBOT_VALIDATION: The validation string
/usr/local/bin/auth.sh
#!/bin/sh
keyfile=/etc/bind/tsig.key
server=127.0.0.1
domain=$(expr match "_acme-challenge.$CERTBOT_DOMAIN" '.*\.\(.*\..*\)')
echo "domain: $domain"
echo "trying : update add _acme-challenge.$CERTBOT_DOMAIN 60 txt $CERTBOT_VALIDATION"
nsupdate -d -k $keyfile <<EOT
server $server
zone $domain
update add _acme-challenge.$CERTBOT_DOMAIN 60 txt $CERTBOT_VALIDATION
send
EOT
Intégration
/usr/local/bin/clean.sh
#!/bin/sh
keyfile=/etc/bind/tsig.key
server=127.0.0.1
domain=$(expr match "_acme-challenge.$CERTBOT_DOMAIN" '.*\.\(.*\..*\)')
echo "domain: $domain"
echo "trying : update del _acme-challenge.$CERTBOT_DOMAIN 60 txt"
nsupdate -d -k $keyfile <<EOT
server $server
zone $domain
update del _acme-challenge.$CERTBOT_DOMAIN 60 txt
send
EOT
test
Passer la commande suivant en adaptant la valeur après le drapeau -d.
–dry-run permet de faire un essai à sec
–manual-public-ip-logging-ok permet de passer la question si vous souhaitez être loggué
certbot certonly --preferred-challenges=dns --manual-auth-hook /usr/local/bin/auth --dry-run --manual-cleanup-hook /usr/local/bin/cleanup -d www.integ.tk -d integ.tk --manual --manual-public-ip-logging-ok
[...]
IMPORTANT NOTES:
- The dry run was successful.
Si tout se passe bien « The dry run was successful », on peut enlever le l’option –dry-run et vérifier les certificats dans le répertoire /etc/letsencrypt/live.
Cron
Commande suivante pour ouvrir crontab en mode édition
crontab -e
On joue la commande en –dry-run si ok && alors on la joue sans –dry-run
47 6 * * * root /usr/bin/certbot renew --quiet0 0 8,22 * * /usr/bin/certbot certonly --preferred-challenges=dns --manual-auth-hook /usr/local/bin/auth --dry-run --manual-cleanup-hook /usr/local/bin/cleanup -d www.integ.tk -d integ.tk --manual --manual-public-ip-logging-ok > /dev/null 2>&1 && ./usr/bin/certbot certonly --preferred-challenges=dns --manual-auth-hook /usr/local/bin/auth --manual-cleanup-hook /usr/local/bin/cleanup -d www.integ.tk -d integ.tk --manual --manual-public-ip-logging-ok > /dev/null 2>&147 6 * * * root /usr/bin/certbot renew --quiet
Erreur rencontrée
Mauvais format de clé
Attention, générer la clé avec la commande suivante ramène l’erreur « TSIG error with server: tsig indicates error » ou encore dans le syslog « tsig verify failure (BADKEY) »
dnssec-keygen -a HMAC-SHA256 -b 256 -n HOST _acme-challenge.mail.jbsky.fr
En effet, en testant avec la commande suivante, le serveur ne traite pas avec ce type de clé. Il semblerait que cela soit « deprecated ».
KEYFILE=/dnskey/K_acme-challenge.integ.tk.+157+20343.
nsupdate -d -k $KEYFILE <<EOT
server ns1.jbsky.fr
zone jbsky.fr.
update add _acme-challenge.mail.jbsky.fr. 10 txt yellow
send
EOT

Pas de droit d’écriture
Côté serveur Bind, s’assurer que l’utilisateur bind peut écrire dans son répertoire /etc/bind/
chown bind: /etc/bind