Donc, au final, après avoir fait une introduction qui s’est éternisée et est devenue un article à part entière …
Je documente ici comment j’ai mis en place mes certificats wildcard grâce à Letsencrypt et la vérification DNS
Alors comme je l’expliquai en partie dans l’autre article, j’avais déjà mis en place Letsencrypt avec des certificats pour chaque sous-domaine avec l’outil certbot et là je souhaitais mettre en place une vérification DNS pour obtenir un certificat wildcard
Mon domaine étant enregistré chez OVH et utilisant leur DNS, je devais utiliser le plugin officiel OVH pour l’outil certbot.
Pour la mise en place, je me suis servi principalement de la doc https://certbot-dns-ovh.readthedocs.io/en/stable/
Donc déjà avant toutes actions , un petit backup pour ne rien casser. Pour moi ça passe par un snapshot de ma VM et un backup du dossier /etc/letsencrypt
tar -cvzf ~/letsencrypt.tar.gz /etc/letsencrypt
Disclaimer: sur ma machine je suis root, c'est mal, je sais!! n'oubliez pas le petit sudo devant les commandes si nécessaire.
Sur ma distribution Ubuntu 18.04.3 LTS , la version de certbot est un peu en retrait 0.31. à l’heure où j’écris ces lignes.
j’ai donc installé une version plus récente avec le gestionnaire de paquet python (pip) et non celui des repo officiels Ubuntu. Je désinstalle le paquet certbot de ma distrib et purge tous les fichiers.
apt purge certbot
Petite mise à jour de tout le système (attention moi je le fais, car je n’ai pas beaucoup d’enjeux de production, que j’ai fait un snapshot juste avant et que donc je peux vite revenir à un état fonctionnel. Mais il y a un principe qui est vraiment bien à respecter : « If it works, don’t fix it » si ça fonctionne, pas besoin de le réparer (ou de le mettre à jour sans raison dans un environnent de prod))
apt update && apt upgrade
Ensuite s’il n’est pas déjà installé, installer pip et ses dépendances
apt install python3-pip python3-venv libaugeas0
Update 04/11/2024: la documentation officiel pour l'installation de certbot a changé depuis. Suivez la documentation et installez certbot-dns-ovh à l'étape 8 - Install correct DNS plugin. les étapes suivantes de cet article pour la partie OVH reste valide
Une fois que le gestionnaire de paquet python est installé, on peut donc installer certbot et le plugin OVH
pip install certbot
pip install certbot-dns-ovh
Ensuite pour éviter d’avoir qu’un seul et unique fichier de logs immense et grandissant sans cesse, on définit une stratégie de rotation des logs pour certbot, on créer donc le fichier de config logrotate pour certbot
touch /etc/logrotate.d/certbot
Et on y copie la config suivante
/var/log/letsencrypt/*.log {
monthly
rotate 6
compress
delaycompress
notifempty
missingok
create 640 root adm
}
Update 04/11/2024: la documentation officiel pour l'installation de certbot a changé depuis. Suivez la documentation et installez certbot-dns-ovh à l'étape 8 - Install correct DNS plugin. les étapes suivantes de cet article pour la partie OVH reste valide
Pour l’exécuter tous les jours, je n’ai pas suivi les recommandations de la documentation.
echo "0 0,12 * * * root /opt/certbot/bin/python -c 'import random; import time; time.sleep(random.random() * 3600)' && sudo certbot renew -q" | sudo tee -a /etc/crontab > /dev/null
Il y a un temps d’attente aléatoire pour éviter que tous ceux qui suivent la documentation sollicitent les serveurs de Let’s Encrypt à la même heure, soit à 00:00 et 12:00. De mon côté, je l’ai fixé à 06:00.
Étant donné que j’ai édité directement la crontab de l’utilisateur root avec :
sudo crontab -e
je n’ai pas besoin de sudo
dans sudo certbot renew -q
.
ma crontab est donc tout simplement
0 6 * * * certbot renew -q
Bon maintenant la mise en place du challenge DNS va se passer grosso modo de la même manière que pour les sous-domaines expliqués ici.
Pour vérifier que le domaine nous appartient bien, Letsencrypt va nous demander de placer un enregistrement DNS, si ensuite lorsqu’il vérifie, l’enregistrement est bien là, c’est que le domaine nous appartient bien.
Seuleument, nous n’allons pas placer l’enregistrement à la main, nous allons nous servir de l’api OVH pour que la commande certbot et le plugin le fassent tout seuls comme des grands
Pour ça on se rend sur l’interface OVH pour se créer des accès à l’API https://api.ovh.com/createToken/
l’idée est de donner accès à certbot de manière illimité dans le temps aux méthodes permettant de gérer les enregistrements DNS de tous mes domaines
GET /domain/zone/*
PUT /domain/zone/*
POST /domain/zone/*
DELETE /domain/zone/*
Si tu as besoin de restreindre les droits à certains domaines, tu dois définir les accès aux méthodes domaine par domaine
GET /domain/zone/
GET /domain/zone/{zoneName}/status
GET /domain/zone/{zoneName}/record
GET /domain/zone/{zoneName}/record/*
POST /domain/zone/{zoneName}/record
POST /domain/zone/{zoneName}/refresh
DELETE /domain/zone/{zoneName}/record/*
Où {zoneName} est ton nom de domaine
Une fois les informations d’accès à l’api obtenues, il faut créer un fichier qui les contient.
nano /root/.ovhapi
Et met y les informations
dns_ovh_endpoint = ovh-eu
dns_ovh_application_key = xxx
dns_ovh_application_secret = xxx
dns_ovh_consumer_key = xxx
Seul le proprio de ce fichier devrait y avoir accès donc n’oublie pas
chmod 600 /root/.ovhapi
Voilà maintenant tout est en place pour que certbot puisse accéder à l’API OVH. La petite commande qui va bien pour obtenir un certificat
certbot certonly --dns-ovh --dns-ovh-credentials ~/.ovhapi -d anthony-jacob.com -d *.anthony-jacob.com --dns-ovh-propagation-seconds 240 --non-interactive --agree-tos
Voilà si tout s’est bien passé, tu as un certificat valide pour les 90 prochains jour. N’oublie pas de mettre ne place un renouvellement automatique et de recharger ton serveur web. De mon côté je tente un renouvellement tous les mois
crontab -e
et ajoutes-y une ligne
0 0 1 * * certbot renew && service apache2 reload
Si tu l’as suivi et si ça t’a aidé, dis-le-moi dans les commentaires et n’hésite pas aussi à faire un retour s’il y a une correction à apporter