Renouvellement d’un certificat interne avec step-ca et Certbot

step-ca supporte nativement le protocole ACME (Automatic Certificate Management Environment) — le même protocole utilisé par Let’s Encrypt. Cela signifie que n’importe quel client ACME, dont Certbot, peut obtenir et renouveler automatiquement des certificats auprès de votre CA interne, sans intervention humaine.

Dans cet article, vous allez :

  • Activer le provisioner ACME dans step-ca
  • Installer et configurer Certbot pour qu’il utilise votre CA interne
  • Obtenir un certificat TLS pour un site Nginx
  • Vérifier que le renouvellement automatique fonctionne

Prérequis

  • step-ca installé et fonctionnel (voir l’article précédent)
  • Un serveur Debian 12 avec Nginx installé
  • Un accès root ou sudo sur les machines concernées
  • Un nom DNS interne résolvable (ex. : local.lan)

💡 Les commandes suivantes sont à exécuter en root, ou précédées de sudo si vous êtes connecté avec un utilisateur standard.


Rappel : comment fonctionne ACME ?

ACME est un protocole standardisé (RFC 8555) qui automatise l’émission et le renouvellement de certificats. Le principe est simple :

  1. Le client (Certbot) demande un certificat au serveur ACME (step-ca)
  2. Le serveur ACME lance un défi (challenge) pour prouver que le client contrôle bien le domaine
  3. Le client répond au défi — pour un usage interne, on utilise le challenge HTTP-01 via Nginx
  4. Le serveur ACME émet le certificat

L’avantage par rapport à une émission manuelle : ce cycle se répète automatiquement avant chaque expiration. Vous n’avez plus à vous souvenir de renouveler les certificats.


Étape 1 — Activer le provisioner ACME dans step-ca

1.1 Ajouter le provisioner

Par défaut, step-ca n’expose pas d’endpoint ACME. Il faut l’activer explicitement avec la commande suivante, sur le serveur step-ca :

# step ca provisioner add acme --type ACME
✔ CA Configuration: /root/.step/config/ca.json

Success! Your `step-ca` config has been updated. To pick up the new configuration SIGHUP (kill -1 <pid>) or restart the step-ca process.

Cette commande modifie le fichier $STEPPATH/config/ca.json et ajoute un provisioner de type ACME.

1.2 Redémarrer step-ca

root@debian-pki:/root/.step# systemctl restart step-ca
systemctl status step-ca
● step-ca.service - step-ca service
     Loaded: loaded (/etc/systemd/system/step-ca.service; enabled; preset: enabled)
     Active: active (running) since Sun 2026-03-29 19:25:34 CEST; 16ms ago
 Invocation: db7bca935c3d4416ab4023f1330bc676
   Main PID: 2182 ((step-ca))
      Tasks: 1 (limit: 2298)
     Memory: 1.5M (peak: 1.7M)
        CPU: 9ms
     CGroup: /system.slice/step-ca.service
             └─2182 "(step-ca)"

Modifier le fichier ca.json pour que step-ca écoute sur tous les ports.

vi /root/.step/config/ca.json
  "address": ":443",

1.3 Vérifier l’endpoint ACME

# curl --cacert $(step path)/certs/root_ca.crt   https://debian-pki.lab.local/acme/acme/directory

{"newNonce":"https://debian-pki.lab.local/acme/acme/new-nonce","newAccount":"https://debian-pki.lab.local/acme/acme/new-account","newOrder":"https://debian-pki.lab.local/acme/acme/new-order","revokeCert":"https://debian-pki.lab.local/acme/acme/revoke-cert","keyChange":"https://debian-pki.lab.local/acme/acme/key-change"}

Vous devriez obtenir un objet JSON listant les URL du protocole ACME.

💡 Le chemin /acme/acme/directory correspond au provisioner nommé acme. Si vous avez choisi un nom différent, adaptez l’URL en conséquence.



Étape 2 — Installer et configurer Certbot

3.1 Installer Certbot

# apt install certbot python3-certbot-nginx -y

3.3 Obtenir un certificat avec Certbot pour nginx

Lancez Certbot en lui indiquant l’URL du serveur ACME de step-ca :

certbot --nginx \
  --server https://debian-pki.lab.local/acme/acme/directory \
  -d debian-nginx.lab.local \
  --agree-tos \
  --email admin@lab.local

Certbot va automatiquement :

  • Communiquer avec step-ca via le protocole ACME
  • Déposer un fichier de validation dans le répertoire web de Nginx (challenge HTTP-01)
  • Récupérer le certificat signé par votre CA interne
  • Modifier la configuration Nginx pour activer HTTPS

3.4 Vérifier le certificat obtenu

$ sudo certbot certificates
Saving debug log to /var/log/letsencrypt/letsencrypt.log

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Found the following certs:
  Certificate Name: debian-nginx.lab.local
    Serial Number: 5ae76c1332b0ed58271ab6e1379fd0a2
    Key Type: ECDSA
    Domains: debian-nginx.lab.local
    Expiry Date: 2026-03-31 17:30:08+00:00 (VALID: 23 hour(s))
    Certificate Path: /etc/letsencrypt/live/debian-nginx.lab.local/fullchain.pem
    Private Key Path: /etc/letsencrypt/live/debian-nginx.lab.local/privkey.pem


Étape 4 — Vérifier le renouvellement automatique

5.1 Le timer systemd de Certbot

Sur Debian 12, l’installation de Certbot crée automatiquement un timer systemd qui déclenche le renouvellement deux fois par jour :

$ systemctl status certbot.timer

$ systemctl cat certbot.timer
# /usr/lib/systemd/system/certbot.timer
[Unit]
Description=Run certbot twice daily

[Timer]
OnCalendar=*-*-* 00,12:00:00
RandomizedDelaySec=43200
Persistent=true

[Install]
WantedBy=timers.target

5.2 Simuler un renouvellement

Pour tester le processus sans réellement renouveler le certificat :

certbot renew --dry-run \
  --server https://debian-pki.lab.local/acme/acme/directory

Si le test se termine avec Congratulations, all renewals succeeded, le renouvellement automatique est opérationnel.

⚠️ Par défaut, step-ca émet des certificats avec une durée de vie de 24h. Si vous souhaitez augmenter cette durée, modifiez le provisioner ACME dans ca.json (paramètre maxTLSCertDuration).



Dépannage courant

Certbot ne fait pas confiance à step-ca

Vérifiez que le certificat racine est bien installé dans le store système (étape 2). Relancez update-ca-certificates si vous venez de l’ajouter.

Le challenge HTTP-01 échoue

Vérifiez que le port 80 est accessible depuis step-ca vers votre serveur Nginx. Le firewall est souvent la cause. Vérifiez également que le server_name Nginx correspond exactement au domaine demandé.

Erreur de connexion à l’endpoint ACME

Vérifiez que step-ca est bien démarré, que le port 9000 est accessible, et que vous utilisez le bon chemin dans l’URL (/acme/<nom_provisioner>/directory).

Le renouvellement ne recharge pas Nginx.


Conclusion

Vous disposez maintenant d’une infrastructure PKI interne complète avec un renouvellement de certificats entièrement automatisé. Le protocole ACME, combiné à step-ca et Certbot, vous permet de bénéficier du même niveau d’automatisation que Let’s Encrypt — mais pour vos services internes, sans aucune dépendance externe.