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
sudo apt update && sudo apt upgrade -y
sudo apt install certbot
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
#
