Obtenir un certificat SSL Let’s Encrypt

📖 4 min de lecture • 637 mots

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
#