Lab – Linux : Obtenir un certificat SSL Let’s Encrypt
Pour obtenir un certificat pour votre service web, nous allons nous appuyer sur la solution certbot sous Linux. Toutes les méthodes ne seront pas détaillées ici, nous nous concentrerons sur Apache et HAProxy. Toutefois, il existe d’autre solution clé en main comme traefik qui intègre un proxy inversé et la gestion du protocole ACME pour les certificats.
Attention : Tous les certificats produit sous l’étiquette Let’s Encrypt sont générés par des sociétés américaines et sont donc soumis aux règles d’embargo américain. En cas d’hébergement de service (localisation géographique) dans un pays soumis à un embargo. Les certificats d’un même propriétaire peuvent être révoquée sans appel même si les autres services sont hébergés ailleurs.
Pré-requis d’installation
- Le port 80 doit être accessible avec un challenge HTTP
- L’accès à la déclaration des DNS est obligatoire pour le challenge DNS
- Les droits root sur le serveur pour installer certbot
Installation
Sur Debian/Ubuntu récents, Certbot est disponible dans les dépôts standards.
sudo apt update
sudo apt install certbot
Vérifiez ensuite la bonne installation de la version
certbot --version
Création du premier certificat
Pour un premier certificat simple sur example.com en mode manuel + challenge DNS (DNS-01).
Pour obtenir, le challenge DNS, il faudra créer des enregistrements TXT sur le domaine.
sudo certbot certonly \
--manual \
--preferred-challenges dns \
-d example.com
Au cour de la création du certificat, un message affichera la valeur à créer comme ci dessous.
Please deploy a DNS TXT record under the name
_acme-challenge.example.com with the following value:
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
Vérification de l’enregistrement DNS avant de poursuivre la génération.
dig TXT _acme-challenge.example.com +short
Explications des options
certonly: obtient le certificat sans modifier la configuration du serveur web.--manual: vous gérez vous‑même la validation (ici via DNS).--preferred-challenges dns: demande spécifiquement le challenge DNS‑01.-d example.com: nom de domaine à certifier. Pour un certificat wildcard, on peut spécifié -d ‘*.example.com’
Les certificats sont générés à cet endroit.
Chemin du certificat :
/etc/letsencrypt/live/example.com/fullchain.pem
Chemin de la clé privée :
/etc/letsencrypt/live/example.com/privkey.pem
Configuration avec arrêt de service et utilisation du port 80
# service apache2 stop
# ou
service haproxy stop
sudo certbot certonly --standalone
Configuration sans arrêt de service et utilisation de l’instance apache
sudo certbot certonly --webroot
Les instances apaches sont détectée automatiquement à partir du moment ou la configuration est stocké dans /etc/apache/
Où trouver les certificats ?
Tous les certificats sont générés par défaut dans /etc/letsencrypt/live/. Un sous répertoire est créé pour chaque FQDN avec son nom.
Renouvellement manuel des certificats
sudo certbot renew
Automatisation du renouvellement de certificat
Les certificats générés sont valables 3 mois à partir de la date de génération. Toutefois, la durée maximale des certificats publics a beaucoup diminué : elle est passée à 398 jours à 200 jours en mars 2026, puis elle passera à 100 jours en mars 2027, et 47 jours en mars 2029.
Script de renouvellement « cert-renew.sh » :
#service haproxy stop
service apache2 stop
# renouvellemnt des certificats Let's Encrypt (si besoin) :)
certbot renew
#recreation des certificat PEM pour haproxy
for site in `ls --directory /etc/letsencrypt/live/*.fr` ; do
echo "concatenation des certificat ${site}/fullchain.pem ${site}/privkey.pem dans ${site}.pem"
`cat ${site}/fullchain.pem ${site}/privkey.pem > ${site}.pem `
done
#service haproxy start
service apache2 start
Utilisation de la crontab pour le renouveler tous les mois en créant un lien symbolique de votre script dans /etc/cron.monthly
ln -s /path_root/cert-renew.sh /etc/cron.monthly/cert-renew.sh
Pour plus de personnalisation, on peut ajouter la ligne à /etc/crontab (non recommandé). Exemple d’un lancement tous les 1er du mois à 4:52 du matin.
# /etc/crontab: system-wide crontab
# Unlike any other crontab you don't have to run the `crontab'
# command to install the new version when you edit this file
# and files in /etc/cron.d. These files also have username fields,
# that none of the other crontabs do.
SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
# Example of job definition:
# .---------------- minute (0 - 59)
# | .------------- hour (0 - 23)
# | | .---------- day of month (1 - 31)
# | | | .------- month (1 - 12) OR jan,feb,mar,apr ...
# | | | | .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# | | | | |
# * * * * * user-name command to be executed
17 * * * * root cd / && run-parts --report /etc/cron.hourly
25 6 * * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily )
47 6 * * 7 root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.weekly )
52 6 1 * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.monthly )
#
52 4 1 * * root /root/cert-renew.sh
#
Exemple d’intégration pour Apache :
Activez les modules SSL et redémarrez Apache.
sudo a2enmod ssl headers rewrite
sudo systemctl restart apache2
Vérifiez avec apache2ctl -M | grep ssl : vous devez voir ssl_module.
Dans le VirtualHost, intégrer les lignes suivantes :
SSLEngine on
SSLCertificateFile /etc/letsencrypt/live/example.com/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/example.com/privkey.pem
Include /etc/letsencrypt/options-ssl-apache.conf # Options sécurisées auto-inclues par Certbot
Exemple d’intégration pour Nginx
Exemple d’implémentation dans un bloc server :
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
Rechargez la configuration
sudo systemctl reload nginx
Exemple d’intégration pour HAProxy :
Exemple d’implémentation, le fichier haproxy.cfg
front https
# ecoute sur le port 80 et 443
bind 0.0.0.0:80
bind :::80
bind 0.0.0.0:443 ssl crt /etc/letsencrypt/live/exemple.com.pem
bind :::443 ssl crt /etc/letsencrypt/live/exemple.com.pem
Pour HAProxy, le format de certificat doit être au format pem full chaine.
#recreation des certificat PEM pour haproxy
for site in ls --directory /etc/letsencrypt/live/*.example.com ; do echo "cat ${site}/fullchain.pem ${site}/privkey.pem > ${site}.pem"
cat ${site}/fullchain.pem ${site}/privkey.pem > ${site}.pemdone
service haproxy restart
