Sécurité

Automatiser le renouvellement de vos certificats : le TP ACME

2026-09-09 · Pierre

Nous vous annoncions en 2025 que la durée de vie des certificats allait tomber à 47 jours. Ce n’est plus une prévision : depuis le 15 mars 2026, le plafond est de 200 jours. Il passera à 100 jours en mars 2027, puis à 47 en mars 2029.

Autrement dit, la question n’est plus de savoir s’il faut automatiser, mais si votre automatisation tiendra. Beaucoup d’infrastructures ont un certbot installé il y a trois ans, jamais vérifié depuis, qui renouvelle correctement jusqu’au jour où il échoue en silence. Avec des certificats de 47 jours, ce silence coûte un site en panne en moins de deux mois.

Ce TP monte une chaîne complète et vérifiable, puis la supervise.

Faits clés

  • Calendrier voté par le CA/Browser Forum en avril 2025 (ballot SC-081v3, adopté par 29 voix pour et aucune contre) : 200 jours au 15 mars 2026, 100 jours au 15 mars 2027, 47 jours au 15 mars 2029.
  • La validation de domaine suit : la réutilisation d’une validation SAN tombera de 398 à 10 jours d’ici 2029. Autrement dit, même la preuve de contrôle du domaine devra être automatisée.
  • Cela concerne tous les certificats publiquement reconnus, commerciaux compris. Payer plus cher n’achète plus de durée.
  • DNS-01 est le seul défi qui permette les certificats wildcard, et le seul qui fonctionne sans exposer le serveur sur le port 80.
  • Le point de rupture le plus fréquent n’est pas le renouvellement mais le rechargement du service, qui continue de servir l’ancien certificat en mémoire.

Où on en est vraiment

ÉchéanceValidité maximaleConséquence pratique
Avant mars 2026398 joursUn renouvellement annuel à la main restait tenable.
15 mars 2026
en vigueur
200 joursDeux renouvellements par an. Le manuel devient pénible.
15 mars 2027100 joursPresque quatre par an. Le manuel devient déraisonnable.
15 mars 202947 joursEnviron huit par an et par certificat. Le manuel est exclu.

Une conséquence sous-estimée : la réutilisation de la validation de contrôle de domaine se réduit en parallèle, jusqu’à 10 jours pour les SAN d’ici 2029. Aujourd’hui, une validation faite une fois vaut longtemps. Demain, votre automatisation devra aussi reprouver régulièrement que le domaine est bien à vous. Un script qui dépose un fichier à la main lors de la première émission ne suffira plus.

Étape 1 : choisir son client ACME

ACME est le protocole d’émission automatisée popularisé par Let’s Encrypt. Trois clients couvrent l’essentiel des besoins.

ClientPoints fortsÀ savoir
certbot
Le plus documenté, paquets dans toutes les distributions, greffons pour Apache et Nginx qui modifient la configuration tout seuls. Dépendances Python. Les greffons qui écrivent dans votre configuration sont pratiques au début, moins quand vous avez une configuration sur mesure.
acme.sh
Un script shell, zéro dépendance. Prend en charge un très grand nombre de fournisseurs DNS pour le défi DNS-01. Notre préférence quand il faut du DNS-01 ou tourner dans un conteneur minimaliste.
lego
Un binaire Go unique, pratique à embarquer. Beaucoup de fournisseurs DNS supportés. Bon choix quand vous industrialisez et voulez un seul fichier à déployer.

Si votre reverse proxy sait le faire lui-même, c’est encore mieux. Caddy et Traefik gèrent ACME nativement, sans client externe ni tâche planifiée à surveiller.

Étape 2 : HTTP-01 ou DNS-01 ?

C’est le choix structurant du TP. L’autorité de certification doit vérifier que le domaine vous appartient, et deux méthodes dominent.

 HTTP-01DNS-01
PrincipeUn fichier est déposé sous /.well-known/acme-challenge/ et l’autorité vient le lire.Un enregistrement TXT est créé dans la zone DNS et l’autorité l’interroge.
WildcardImpossible.Seule méthode possible.
Port 80 ouvertObligatoire, depuis Internet.Inutile.
Serveur non exposéNe fonctionne pas.Fonctionne, y compris sur un réseau interne.
PrérequisAucun, hors accessibilité.Une API chez votre hébergeur DNS, et un jeton à protéger.
Quand le choisirServeur web public, un ou quelques domaines.Wildcards, services internes, ou parc à industrialiser.

Notre recommandation : DNS-01 dès que vous gérez plus d’une poignée de certificats. Il vous affranchit de l’accessibilité du serveur sur le port 80, ce qui élimine d’un coup une famille entière de pannes de renouvellement : pare-feu modifié, redirection HTTPS trop zélée, machine placée derrière un filtrage.

Le jeton DNS mérite mieux qu’un fichier en clair

DNS-01 suppose de confier à votre serveur une clé d’API capable de modifier votre zone DNS. Une clé volée permet de détourner votre domaine, ce qui est nettement plus grave qu’un certificat compromis. Utilisez une clé restreinte à la zone concernée quand votre hébergeur le permet, stockez-la dans un fichier en chmod 600 appartenant à root, et préférez, si l’option existe, une délégation via un sous-domaine _acme-challenge dédié plutôt qu’un accès total à la zone.

Étape 3 : émettre le certificat

Émission avec acme.sh
# Installation (installe aussi la tache planifiee de renouvellement)
curl https://get.acme.sh | sh -s email=admin@exemple.fr

# Choisir l'autorite de certification par defaut
acme.sh --set-default-ca --server letsencrypt

# --- Option A : HTTP-01, serveur web public ---
acme.sh --issue -d exemple.fr -d www.exemple.fr \
  --webroot /var/www/exemple.fr/public

# --- Option B : DNS-01 avec wildcard (exemple OVH) ---
export OVH_AK="votre_application_key"
export OVH_AS="votre_application_secret"
export OVH_CK="votre_consumer_key"
acme.sh --issue -d exemple.fr -d '*.exemple.fr' --dns dns_ovh

# Installer les fichiers a un emplacement stable et recharger
acme.sh --install-cert -d exemple.fr \
  --key-file       /etc/ssl/exemple.fr/privkey.pem \
  --fullchain-file /etc/ssl/exemple.fr/fullchain.pem \
  --reloadcmd      "systemctl reload nginx"
Clé ne pointez jamais votre serveur web vers le répertoire interne d’acme.sh. Passez toujours par --install-cert.

Ce dernier point est important et souvent mal compris. Le répertoire de travail d’acme.sh est un espace interne dont l’organisation peut changer d’une version à l’autre. L’option --install-cert copie les fichiers à un emplacement que vous maîtrisez et mémorise la commande de rechargement, qui sera rejouée à chaque renouvellement.

Étape 4 : recharger le service

C’est la cause n°1 des incidents de certificat, et elle est particulièrement vicieuse : le renouvellement réussit, les fichiers sur le disque sont à jour, tout semble normal. Mais le service tourne toujours avec l’ancien certificat chargé en mémoire, et continue de le présenter aux visiteurs jusqu’à expiration.

Commandes de rechargement par service
# Serveurs web : rechargement a chaud, sans coupure
systemctl reload nginx
systemctl reload apache2

# Messagerie : Postfix recharge a chaud, Dovecot aussi
systemctl reload postfix dovecot

# HAProxy : rechargement a chaud si le service est bien configure
systemctl reload haproxy

# PostgreSQL : recharge le certificat sans redemarrer
systemctl reload postgresql

# Conteneurs : il faut agir DANS le conteneur, pas sur l'hote
docker exec mon-nginx nginx -s reload

# Verifier la date d'expiration REELLEMENT servie sur le port
echo | openssl s_client -connect exemple.fr:443 -servername exemple.fr 2>/dev/null \
  | openssl x509 -noout -dates -subject
Règle la dernière commande est la seule qui dise la vérité : elle interroge le port, pas le disque.

Retenez cette distinction : vérifier le fichier sur le disque ne prouve rien. Seule l’interrogation du port révèle ce que vos visiteurs reçoivent réellement.

Étape 5 : tester le renouvellement

Une automatisation jamais testée n’est pas une automatisation, c’est un pari. Les deux clients proposent un mode d’essai qui déroule tout le processus sans consommer les quotas de l’autorité.

Vérifier que ça renouvellera vraiment
# certbot : simulation complete, sans emission reelle
certbot renew --dry-run

# acme.sh : forcer un vrai renouvellement pour valider la chaine
acme.sh --renew -d exemple.fr --force

# Verifier que la tache planifiee existe VRAIMENT
acme.sh --list
crontab -l | grep acme
systemctl list-timers | grep -i certbot

# Le test qui compte : la date servie sur le port a-t-elle bouge ?
echo | openssl s_client -connect exemple.fr:443 -servername exemple.fr 2>/dev/null \
  | openssl x509 -noout -enddate
Rappel un renouvellement réussi dont le service n’a pas été rechargé est un échec qui s’ignore.

Étape 6 : superviser l’expiration

Même bien configurée, une automatisation peut tomber : clé d’API DNS révoquée, changement de règle sur le pare-feu, domaine transféré chez un autre registrar, disque plein. La supervision n’est pas une précaution de luxe, c’est le filet.

Le principe : vérifier chaque jour la date d’expiration servie sur le port, et alerter bien avant l’échéance. Avec des certificats de 47 jours, un seuil d’alerte à 30 jours n’a plus de sens : il se déclencherait presque en permanence. Visez plutôt 10 à 14 jours, ce qui laisse le temps d’intervenir sans crier au loup.

check-certificats.sh
#!/usr/bin/env bash
# Alerte si un certificat servi expire dans moins de SEUIL jours.
set -uo pipefail
SEUIL=14
DOMAINES=(exemple.fr www.exemple.fr mail.exemple.fr intranet.exemple.fr)
code_sortie=0

for d in "${DOMAINES[@]}"; do
  fin=$(echo | timeout 10 openssl s_client -connect "$d:443" -servername "$d" 2>/dev/null \
        | openssl x509 -noout -enddate 2>/dev/null | cut -d= -f2)

  if [ -z "$fin" ]; then
    echo "CRITIQUE  $d : impossible de recuperer le certificat"
    code_sortie=2
    continue
  fi

  # GNU date (Linux). Sur macOS/BSD : date -j -f "%b %d %T %Y %Z"
  reste=$(( ( $(date -d "$fin" +%s) - $(date +%s) ) / 86400 ))

  if   [ "$reste" -lt 0 ];       then echo "EXPIRE    $d : depuis $((-reste)) j"; code_sortie=2
  elif [ "$reste" -lt "$SEUIL" ]; then echo "ALERTE    $d : expire dans $reste j"; code_sortie=2
  else                                echo "OK        $d : $reste j restants"
  fi
done

exit $code_sortie
Usage en cron quotidien, ou comme sonde Nagios et Centreon : le code de sortie 2 vaut CRITICAL.

Supervisez tous les services qui présentent un certificat, pas seulement le site web : la messagerie sur 993 et 465, le VPN, l’intranet, les API internes. Ce sont précisément ceux qu’on oublie, parce que personne ne s’en plaint avant que ça casse.

Les pièges classiques

SymptômeCauseCe qu’on fait
Le fichier est à jour mais le navigateur voit un certificat périmé Le service n’a pas été rechargé. Vérifier le --reloadcmd ou le hook de déploiement. Contrôler via openssl s_client, jamais sur le disque.
HTTP-01 échoue depuis une refonte du site Une redirection globale vers HTTPS ou vers une nouvelle URL intercepte /.well-known/acme-challenge/. Exclure explicitement ce chemin de toute redirection ou réécriture.
Renouvellement en échec sur un serveur interne HTTP-01 exige une accessibilité depuis Internet, que la machine n’a pas. Basculer en DNS-01, qui ne demande aucune exposition.
Blocage par quota de l’autorité Trop de tentatives, souvent une boucle de renouvellement forcé. Utiliser l’environnement de test pendant la mise au point, et --dry-run plutôt que --force.
Ça marchait, puis plus rien après une migration La tâche planifiée n’a pas suivi, ou le compte qui la portait a disparu. Contrôler crontab -l et systemctl list-timers après toute migration. La supervision aurait rattrapé le coup.
Certificat valide sur le site, alerte chez un client de messagerie Le service de messagerie n’est pas dans le périmètre de renouvellement. Inventorier tous les services TLS, pas seulement le port 443.

Et chez Datacampus ?

Sur nos offres infogérées, ACME et Let’s Encrypt sont installés et supervisés par défaut : émission, renouvellement, rechargement des services et alerte sur l’expiration. La réduction à 47 jours ne changera rien pour nos clients infogérés, pour la simple raison que rien n’était manuel au départ.

Si vous gérez vous-même vos serveurs, le script de supervision ci-dessus est un bon point de départ, et il est à vous.

TL;DR, ce qu’il faut retenir

  • Le plafond est de 200 jours depuis le 15 mars 2026, puis 100 en 2027 et 47 en 2029.
  • La réutilisation de la validation de domaine descend en parallèle, jusqu’à 10 jours pour les SAN.
  • DNS-01 dès que vous dépassez quelques certificats : wildcards possibles, aucune exposition du port 80.
  • Protégez la clé d’API DNS, elle est plus sensible que le certificat lui-même.
  • Le rechargement du service est la panne n°1 : vérifiez sur le port, pas sur le disque.
  • Testez avec --dry-run et vérifiez que la tâche planifiée existe réellement.
  • Supervisez l’expiration à 10 ou 14 jours, sur tous les services TLS et pas seulement le port 443.

FAQ — Automatiser ses certificats

Quelle est la durée de vie maximale d’un certificat SSL aujourd’hui ?

200 jours depuis le 15 mars 2026. Elle passera à 100 jours le 15 mars 2027, puis à 47 jours le 15 mars 2029, conformément au ballot SC-081v3 adopté par le CA/Browser Forum en avril 2025. Cela s’applique à tous les certificats publiquement reconnus, y compris commerciaux.

HTTP-01 ou DNS-01, lequel choisir ?

HTTP-01 suffit pour un serveur web public avec un ou deux domaines. DNS-01 devient nécessaire dans trois cas : vous voulez un certificat wildcard, votre serveur n’est pas joignable depuis Internet, ou vous gérez un parc et voulez supprimer la dépendance à l’accessibilité du port 80. En contrepartie, DNS-01 demande une clé d’API sur votre zone DNS, qu’il faut protéger sérieusement.

Pourquoi mon certificat est renouvelé mais le navigateur voit l’ancien ?

Parce que le service n’a pas été rechargé. Le fichier sur le disque est à jour, mais Nginx, Apache ou Postfix continuent de servir le certificat chargé en mémoire au démarrage. C’est la cause n°1 des incidents. Vérifiez toujours avec openssl s_client -connect domaine:443, qui interroge le port et non le disque.

certbot ou acme.sh ?

certbot est le plus documenté et dispose de greffons qui configurent Apache et Nginx automatiquement, au prix de dépendances Python. acme.sh est un simple script shell sans dépendance, avec une prise en charge très large des fournisseurs DNS : c’est notre préférence pour DNS-01 et les environnements minimalistes. lego, un binaire Go unique, est pratique pour industrialiser.

À combien de jours régler l’alerte d’expiration ?

Entre 10 et 14 jours. Le seuil historique de 30 jours perd son sens avec des certificats de 47 jours : il se déclencherait quasiment en continu et finirait par être ignoré. Surveillez la date réellement servie sur le port, et couvrez tous les services TLS, y compris la messagerie et le VPN.

Les certificats payants échappent-ils à cette réduction ?

Non. Le calendrier s’applique à l’ensemble des certificats publiquement reconnus, quelle que soit l’autorité de certification. La durée de validité était l’un des rares avantages des certificats commerciaux face à Let’s Encrypt : cet écart disparaît.

Faut-il gérer tout ça soi-même ?

Pas si vos serveurs sont infogérés. Chez Datacampus, ACME et Let’s Encrypt sont installés et supervisés par défaut sur les offres infogérées : émission, renouvellement, rechargement des services et alerte sur l’expiration. Le passage à 47 jours sera transparent, puisque rien n’était manuel.

Pour aller plus loin :
CA/Browser Forum — ballot SC-081v3 · acme.sh
• Sur datacampus.fr : La durée de vie passe à 47 jours · Qu’est-ce qu’un fichier CSR ? · Erreur de nom de certificat · Protéger son site web · Infogérance

Vous avez un projet d'hébergement ?

Configurez-le en 2 minutes et recevez votre devis personnalisé sous 48 h. Sans engagement.

Configurer mon hébergement → Nous appeler

Articles sur le même sujet

Sécurité

Sauvegarde anti-ransomware : pourquoi la réplication ne suffit pas

Une réplication n’est pas une sauvegarde, et avoir des sauvegardes ne suffit plus : les ransomwares les ciblent. Immuabilité, règle 3-2-1-1-0, air-gap, et ce qu’on fait concrètement (Proxmox Backup Server, contrôle d’intégrité quotidien) : le guide pour des sauvegardes qui ramènent vos données.

Sécurité

Chiffrement des données « au repos » : ce que ça protège vraiment

C’est la demande qui revient sans arrêt : « vous chiffrez les données au repos ? » Sur un serveur allumé 24/7, les données ne dorment jamais. On vous explique ce que ce chiffrement protège réellement, ce qu’il ne protège pas, et ce qui compte vraiment pour vos données sensibles.

← Retour au blog