Lab – Linux : Obtenir un certificat SSL Let’s Encrypt

📖 6 min de lecture • 1047 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

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