Configuration du challenge DNS-01 pour WildCard Certbot

 

Depuis peu, je suis passé sous mes propres serveurs de noms. Installés avec Bind9, une doc sera bientôt dispo. 

Tout fonctionne à merveille, mais il y a un hic. Pour la validation des wildcards Let's Encrypt, j'utilisais jusqu'à présent l'API CloudFlare. Or, cette technique ne marche plus. Et pour couronner le tout, à l'heure ou j'écris tous mes certificats ont expirés..... 

Il faut donc trouver une méthode alternative au module CloudFlare, car je n'ai pas envie de faire ça à la main pour la quantité colossale de domaines que j'ai à gérer. 

La solution envisagée est : https://certbot-dns-rfc2136.readthedocs.io/en/stable/

Allez c'est parti on se lance dans l'installation. 


Prérequis : 

Installation de Git :

root@Venus-LB-01[PROD:10.35.42.101][0][11:43:18]:~# apt install git python

Rendez-vous dans /tmp pour cloner le repo de Certbot :

root@Venus-LB-01[PROD:10.35.42.101][0][11:43:18]:/tmp# git clone https://github.com/certbot/certbot.git

Se rendre dans certbot/certbot-dns-rfc2136 et lancer l'installation du module : 

root@Venus-LB-01[PROD:10.35.42.101][0][11:43:18]:/tmp/certbot/certbot-dns-rfc2136# python setup.py install

Serveur DNS :

Rendez-vous sur votre serveur DNS en SSH. 

root@NameServer-01[PROD:10.35.42.108][0][11:48:38]:~# cd /etc/bind/
root@NameServer-01[PROD:10.35.42.108][0][11:48:38]:~/etc/bind/# mkdir dnsch-keys

Créeons la clé qui servira d'authentification entre le client et le serveur DNS :

root@NameServer-01[PROD:10.35.42.108][0][11:48:38]:~/etc/bind/dnsch-keys/# dnssec-keygen -a HMAC-SHA512 -b 512 -n HOST HaLBKeyA17. 

NB : HaLBKeyA17 n'est pas un nom fixe ! Vous pouvez le changer ! Mais laissez le point à la fin.

Nous allons à présent retrouver la clé privée, pour cela utilisons la commande : 

root@NameServer-01[PROD:10.35.42.108][0][11:48:38]:~/etc/bind/dnsch-keys/# grep -e Key KHaLBKeyA17.+165+XXXXX.private | cut -d' ' -f2-

L'output devrait ressembler à quelque chose comme ceci :

4q4wM/2I180UXoMyN4INVhJNi8V9BCV+jMw2mXgZw/CSuxUT8C7NKKFs AmKd7ak51vWKgSl12ib86oQRPkpDjg==

Maintenant, nous allons éditer le fichier ou l'on définit nos zones : 

root@NameServer-01[PROD:10.35.42.108][0][11:48:38]:~/etc/bind/# vi named.conf.local

Ajoutez la clé autorisée à créer les enregistrements DNS dans les premières lignes : 

key "KHaLBKeyA17." {
  algorithm hmac-sha512;
  secret "i/KJzuKiYGbWlZ7x3qR6OxXjEX3L8XdeOy90F3aFYtRaGJp/8Ig4HmP/WfG6WsFqoe+a31emvJWeapxmNbnDmA==";
};

Et maintenant nous allons ajouter à chaque zones le bout de code suivant : 

		update-policy {
    	     grant KHaLBKeyA17. name _acme-challenge.cazevieille.com txt;
  };
Nous retrouvons le nom de la clé (à adapter en fonction de la votre) ainsi que l'enregistrement de type TXT qui sera crée sur notre dns.

On donne les droits d'écriture au dossier et on redémarre Bind : 

root@NameServer-01[PROD:10.35.42.108][0][11:48:38]:~/etc/bind/# chown -R root:bind /etc/bind/zones/
root@NameServer-01[PROD:10.35.42.108][0][11:48:38]:~/etc/bind/# chmod 775 /etc/bind/zones/
root@NameServer-01[PROD:10.35.42.108][0][11:48:38]:~/etc/bind/# systemctl restart bind9

Retournons sur notre machine ou Certbot est installé : 

Nous allons maintenant créer le fichier des crédentials pour faire communiquer le module avec le serveur DNS : 

Nous allons créer le fichier suivant : /etc/letsencrypt/dns-credentials.ini 

# Target DNS server
dns_rfc2136_server = 10.35.42.108
# Target DNS port
dns_rfc2136_port = 53
# TSIG key name
dns_rfc2136_name = KHaLBKeyA17.
# TSIG key secret
dns_rfc2136_secret = i/KJzuKiYGbWlZ7x3qR6OxXjEX3L8XdeOy90F3aFYtRaGJp/8Ig4HmP/WfG6WsFqoe+a31emvJWeapxmNbnDmA==
# TSIG key algorithm
dns_rfc2136_algorithm = HMAC-SHA512

Définissons les permissions adéquates : 

root@Venus-LB-01[PROD:10.35.42.101][0][11:43:18]:~# chmod 600 /etc/letsencrypt/dns-credentials.ini

Une fois ceci fait, lancez la commande pour request un certificat SSL par Let's Encrypt : 

root@Venus-LB-01[PROD:10.35.42.101][0][15:33:26]:/etc/haproxy/ssl# certbot certonly \
	  --dns-rfc2136 \
	    --dns-rfc2136-credentials /etc/letsencrypt/dns-credentials.ini \
	      --dns-rfc2136-propagation-seconds 30 \
	        -d *.youporn.com

Nous obtenons le résultat suivant : 

Saving debug log to /var/log/letsencrypt/letsencrypt.log
Plugins selected: Authenticator dns-rfc2136, Installer None
Obtaining a new certificate
Performing the following challenges:
dns-01 challenge for youporn.com
Waiting 30 seconds for DNS changes to propagate
Waiting for verification...
Cleaning up challenges

IMPORTANT NOTES:
 - Congratulations! Your certificate and chain have been saved at:
   /etc/letsencrypt/live/youporn.com-0001/fullchain.pem
   Your key file has been saved at:
   /etc/letsencrypt/live/youporn.com-0001/privkey.pem
   Your cert will expire on 2019-03-12. 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
Back to top