[certbot][bind] DNS Challenge

L’objetif est de générer automatiquement ses certificats Let’s Encrypt avec Certbot. Le scénario est le suivant :

  1. Certbot initie une demande
  2. Let’s Encrypt initie le Request Challenge
  3. Certbot met à jour Bind afin d’etre pret pour le Request Challenge
  4. Certbot informe à Let’s Encrypt que c’est prêt
  5. Let’s Encrypt verifie l’enregistrement DNS
  6. 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
dig TXT _acme-challenge.www.integ.tk.

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

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *