Ça fait un moment que je cherche à comprendre comment créer un certificat Wildcard, la difficulté étant d'insérer un enregistrement DNS de type TXT (_acme-challenge.example.com) au fichier de zone afin que Letsencrypt accepte de créer ou renouveler les certificats.

C'est ce que je vais détailler dans ce tuto avec quelques bonus en sus, comme l’automatisation de la rotation des enregistrements TLSA, des clés DNSSEC ainsi que des notifications slack afin de recevoir les alertes sur votre téléphone .. pratique pour être tenu informer.

Pré requis :
Avoir un domaine chez Gandi
Ce tuto ne s'adresse qu'aux personnes ayant installé le DNS autoritaire avec NSD/DNSSEC via Docker.
https://blog.meshup.net/deploy-nsd-dnssec-with-docker/

Sources :
https://kostikov.co/pereezzhaem-na-wildcard-sertifikaty-lets-encrypt
https://mondedie.fr/d/10347-script-python-ajout-automatique-fingerprint-chez-gandi-nsd-dnssec-via-docker/2

L'idée est d'utiliser la dernière version de certbot qui grâce à ces commandes "--manual-auth-hook", "--manual-cleanup-hook", "--post-hook" et l'aide de scripts va nous permettre :

  • L'insertion de l'enregistrement acme dans le fichier de zone NSD

  • La création de certificats Wildcard

  • La mise à jour automatiques des enregistrements TLSA

  • La rotation des clés DNSSEC

  • La signature de la zone SOA

  • Mise à jour de la zone DNS et signature avec DNSSEC

  • Mise à jour automatique du fingerprint chez GANDI

  • Le café et les petits fours!! 😂

Également un script proposé par @Hardware pour renouveler automatiquement les enregistrements TLSA dont on ne parle pas assez sur le forum mais qui permettent de prouver l'authenticité de l'émetteur du certificat, et donc de certifier que la connexion sécurisée vers le serveur est bien chiffrée et n'est pas détournée. La condition pour son utilisation est l'activation de DNSSEC, sans quoi DANE n'a aucun intérêt.
https://blog.meshup.net/securiser-lacces-a-son-site-internet-avec-le-protocole-dane/
https://mondedie.fr/d/10307-certificat-classique-ou-wildcard/19

J'ai légèrement modifié les scripts de @Hardware pour les rendre compatibles avec ce tuto, du coup j'ai déposé les versions modifiées sur mon github avec une mention pour préciser le nom de l'auteur.


le fichier de zone doit impérativement se présenter sous cette forme :

_dane IN TLSA 3 0 1 ebfba90af284b3e1ba951a15455ff8788b0314e44c3da1a0a7b62596aabb73e4

# Port 443, enregistrements DANE pour mondedie.fr et webmail.mondedie.fr
_443._tcp           IN                CNAME                _dane
_443._tcp.webmail   IN                CNAME                _dane

# Port 25, enregistrements DANE pour mail.mondedie.fr
_25._tcp.mail       IN                CNAME                _dane

Installation de Certbot debian 9

echo "deb http://ftp.debian.org/debian stretch-backports main" >> /etc/apt/sources.list
apt update
apt-get install python-certbot-nginx -t stretch-backports

On récupère ensuite les fichiers du git

cd /tmp
wget https://github.com/laster13/dnstools/archive/master.zip
unzip master.zip
cd dnstools-master
mv *.* /usr/local/bin
cd /usr/local/bin
chmod +x leadd.sh ledel.sh update-mail-tlsa update-tlsa dnssec.py dnsnewserial.sh

Création des certificats

root@mail:#certbot certonly --manual --preferred-challenges=dns --manual-auth-hook leadd.sh --manual-cleanup-hook ledel.sh --renew-hook "service nginx reload" --post-hook "update-mail-tlsa && python /usr/local/bin/dnssec.py" --manual-public-ip-logging-ok --agree-tos --email admin@example.com --cert-name example.com -d example.com -d "*.example.com" --server https://acme-v02.api.letsencrypt.org/directory


Déroulé du script

Renewing an existing certificate
Performing the following challenges:
dns-01 challenge for example.com
dns-01 challenge for example.com
Waiting for verification...
Cleaning up challenges
Running deploy-hook command: service nginx reload
Running post-hook command: update-mail-tlsa && python /usr/local/bin/dnssec.py
Output from update-mail-tlsa:
sending incremental file list
README
cert.pem
chain.pem
fullchain.pem
privkey.pem

sent 12,638 bytes  received 111 bytes  25,498.00 bytes/sec
total size is 12,272  speedup is 0.96
mailserver
Generating ZSK & KSK keys for 'example.com'
Signing zone for example.com
NSD configuration rebuild... reconfig start, read /etc/nsd/nsd.conf
ok
Reloading zone for example.com... ok
Notify slave servers... ok
Done.

IMPORTANT NOTES:
 - Congratulations! Your certificate and chain have been saved at:
   /etc/letsencrypt/live/example.com/fullchain.pem
   Your key file has been saved at:
   /etc/letsencrypt/live/example.com/privkey.pem
   Your cert will expire on 2018-10-04. 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

On peut vérifier les options de renouvellement automatique

cat /etc/letsencrypt/renewal/example.com.conf
# renew_before_expiry = 30 days
version = 0.25.0
archive_dir = /etc/letsencrypt/archive/example.com
cert = /etc/letsencrypt/live/example.com/cert.pem
privkey = /etc/letsencrypt/live/example.com/privkey.pem
chain = /etc/letsencrypt/live/example.com/chain.pem
fullchain = /etc/letsencrypt/live/example.com/fullchain.pem

# Options used in the renewal process
[renewalparams]
installer = None
manual_cleanup_hook = ledel.sh
authenticator = manual
manual_public_ip_logging_ok = True
pref_challs = dns-01,
account = fd7a3565aba701b20177683bec4b63ef
server = https://acme-v02.api.letsencrypt.org/directory
manual_auth_hook = leadd.sh
rsa_key_size = 4096
post_hook = update-mail-tlsa && python /usr/local/bin/dnssec.py
renew_hook = service nginx reload

Si vous n'avez pas installé le mailserver de @Hardware, supprimez ces lignes dans le fichier 'update-mail-tlsa

# Mise à jour des certificats du serveur mail
rsync -Lvr "${LETS_ENCRYPT_LIVE_PATH}/" "/mnt/docker/ssl/live/mail.${DOMAIN}"

# Redémarrage du serveur mail suite au renouvellement des certificats
docker restart mailserver

Enfin on mettra en place un cron pour le renouvellement des certificats

0       3       *       *       0       root    certbot renew >/dev/null 2>&1

Vous pouvez vérifier votre configuration DNS avec les sites suivants

http://dnsviz.net/
http://dnssec-debugger.verisignlabs.com/
https://dane.sys4.de/
https://www.ssllabs.com/ssltest/

Topic de discussion :

https://mondedie.fr/d/10327-discussion-certificat-wilcard-et-serveur-dns-autoritaire-nsd-dnssec-docker

5 ans plus tard

Bonjour,
Merci pour ce tuto fort intéressant ! Étant donné qu'il a été publié en 2018, est-ce encore la meilleur solution ?

Répondre…