Mettre en place une PKI interne avec Step-CA et sécuriser un serveur Nginx

Dans cet article, nous allons déployer une PKI interne avec step-ca, puis générer un certificat TLS pour sécuriser un serveur nginx.

Cette première phase est une mise en place simple pour un lab.


Pourquoi utiliser une PKI interne ?

Dans une infrastructure réelle, on a rapidement besoin de certificats :

  • interfaces d’administration HTTPS
  • reverse proxy
  • API internes
  • équipements réseau ou pare-feux

Une PKI permet simplement d’associer une identité (nom DNS ou machine) à un certificat reconnu comme fiable.
Au lieu de gérer des certificats autosignés sur chaque serveur, on centralise la confiance avec une autorité interne.


Rappel rapide : root, intermédiaire et certificats serveurs

Une PKI repose généralement sur trois éléments :

  • Root CA : racine de confiance, très sensible, utilisée uniquement pour signer.
  • CA intermédiaire : signe les certificats au quotidien.
  • Certificats serveurs : installés sur nginx, firewall ou applications.

Lors de l’initialisation, step-ca crée automatiquement cette structure.


Installation de step-cli et step-ca

$ apt-get update
$ apt-get install -y --no-install-recommends curl gpg ca-certificates
$ sudo curl -fsSL https://packages.smallstep.com/keys/apt/repo-signing-key.gpg -o /etc/apt/keyrings/smallstep.asc
$ sudo vi /etc/apt/sources.list.d/smallstep.sources

Types: deb
URIs: https://packages.smallstep.com/stable/debian
Suites: debs
Components: main
Signed-By: /etc/apt/keyrings/smallstep.asc
$ sudo apt-get update
$ sudo apt-get install step-cli step-ca

Initialisation de la pki

Par défaut, l’initialisation se fait dans le répertoire utilisateur.

bob@debian-pki:~$ step ca init
Use the arrow keys to navigate: ↓ ↑ → ← 
✔ Deployment Type: Standalone
What would you like to name your new PKI?
✔ (e.g. Smallstep): pki-lab
What DNS names or IP addresses will clients use to reach your CA?
✔ (e.g. ca.example.com[,10.1.2.3,etc.]): debian-pki.lab.local
What IP and port will your new CA bind to? (:443 will bind to 0.0.0.0:44✔ (e.g. :443 or 127.0.0.1:443): 192.168.1.15:443█
What would you like to name the CA's first provisioner?
✔ (e.g. you@smallstep.com): bob@lab.local
Choose a password for your CA keys and first provisioner.
✔ [leave empty and we'll generate one]: 

Generating root certificate... done!
Generating intermediate certificate... done!

✔ Root certificate: /home/bob/.step/certs/root_ca.crt
✔ Root private key: /home/bob/.step/secrets/root_ca_key
✔ Root fingerprint: db8a3fafebeffd72e9045d00e52de232517aef1d6efcd3db0baf42aed7a9f911
✔ Intermediate certificate: /home/bob/.step/certs/intermediate_ca.crt
✔ Intermediate private key: /home/bob/.step/secrets/intermediate_ca_key
✔ Database folder: /home/bob/.step/db
✔ Default configuration: /home/bob/.step/config/defaults.json
✔ Certificate Authority configuration: /home/bob/.step/config/ca.json

Your PKI is ready to go. To generate certificates for individual services see 'step help ca'.

FEEDBACK 😍 🍻
  The step utility is not instrumented for usage statistics. It does not phone
  home. But your feedback is extremely valuable. Any information you can provide
  regarding how you’re using `step` helps. Please send us a sentence or two,
  good or bad at feedback@smallstep.com or join GitHub Discussions
  https://github.com/smallstep/certificates/discussions and our Discord 
  https://u.step.sm/discord.
bob@debian-pki:~$ 

L’assistant va demander :

  • le nom de la PKI
  • le DNS de la CA (ex : debian-pki.lab.local)
  • un mot de passe pour protéger les clés privées

Cette étape crée le dossier .step contenant :

  • la configuration
  • les certificats root et intermédiaire
  • la base interne
  • les clés privées

Démarrer step-ca en mode simple (lab)

bob@debian-pki:~$ sudo step-ca $(step path)/config/ca.json
badger 2026/02/22 15:51:49 INFO: All 0 tables opened in 0s
badger 2026/02/22 15:51:49 INFO: Replaying file id: 0 at offset: 0
badger 2026/02/22 15:51:49 INFO: Replay took: 428.177µs
Please enter the password to decrypt /home/bob/.step/secrets/intermediate_ca_key:
2026/02/22 15:51:53 Building new tls configuration using step-ca x509 Signer Interface
2026/02/22 15:51:54 Starting Smallstep CA/0.29.0 (linux/amd64)
2026/02/22 15:51:54 Documentation: https://u.step.sm/docs/ca
2026/02/22 15:51:54 Community Discord: https://u.step.sm/discord
2026/02/22 15:51:54 Config file: /home/bob/.step/config/ca.json
2026/02/22 15:51:54 The primary server URL is https://debian-pki.local.lab:443
2026/02/22 15:51:54 Root certificates are available at https://debian-pki.local.lab:443/roots.pem
2026/02/22 15:51:54 X.509 Root Fingerprint: db8a3fafebeffd72e9045d00e52de232517aef1d6efcd3db0baf42aed7a9f911
2026/02/22 15:51:54 Serving HTTPS on 192.168.1.15:443 …


On ouvre le port 443 sur le firewall.

bob@debian-pki:~$ sudo firewall-cmd --permanent --zone=public --add-port=443/tcp
success
bob@debian-pki:~$ 

Ajouter la confiance vers la PKI depuis le serveur nginx

Sur la machine nginx :

Installer la commande step

sudo apt-get update && sudo apt-get install -y --no-install-recommends curl gpg ca-certificates
sudo curl -fsSL https://packages.smallstep.com/keys/apt/repo-signing-key.gpg -o /etc/apt/keyrings/smallstep.asc
sudo vi /etc/apt/sources.list.d/smallstep.sources
Types: deb
URIs: https://packages.smallstep.com/stable/debian
Suites: debs
Components: main
Signed-By: /etc/apt/keyrings/smallstep.asc

sudo apt update && sudo apt install step-cli

Configuration de la relation de confiance avec la PKI

bob@debian-web:~$ step ca bootstrap --ca-url https://debian-pki.lab.local --fingerprint db8a3fafebeffd72e9045d00e52de232517aef1d6efcd3db0baf42aed7a9f911
The root certificate has been saved in /home/bob/.step/certs/root_ca.crt.
The authority configuration has been saved in /home/bob/.step/config/defaults.json.

Ajout du certificat dans le magasin de confiance du système

bob@debian-web:~$ sudo step certificate install $(step path)/certs/root_ca.crt
Certificate /home/bob/.step/certs/root_ca.crt has been installed.
X.509v3 Root CA Certificate (ECDSA P-256) [Serial: 2893...8086]
  Subject:     pki-lab Root CA
  Issuer:      pki-lab Root CA
  Valid from:  2026-02-22T14:47:09Z
          to:  2036-02-20T14:47:09Z
bob@debian-web:~$ 

On fait la demande du certificat pour le serveur

bob@debian-nginx:~$ step ca certificate debian-nginx.lab.local srv.crt srv.key
✔ Provisioner: bob@lab.local (JWK) [kid: ksgZFS5yswUd8vZXMzGB9FR5z22ggEj7tP-WJvnwo0U]
Please enter the password to decrypt the provisioner key: 
✔ CA: https://debian-pki.lab.local
✔ Certificate: srv.crt
✔ Private Key: srv.key
bob@debian-nginx:~$

Voici une commande de vérification du certificat créé

bob@debian-nginx:~$ step certificate inspect srv.crt  --short
X.509v3 TLS Certificate (ECDSA P-256) [Serial: 1284...4599]
  Subject:     debian-nginx.lab.local
  Issuer:      pli-lab Intermediate CA
  Provisioner: bob@lab.local [ID: ksgZ...wo0U]
  Valid from:  2026-02-27T14:25:24Z
          to:  2026-02-28T14:26:24Z
bob@debian-nginx:~$

On ajoute le certificat à la configuration nginx:

cp /home/bob/srv.* /etc/nginx/ssl/
sudo chown root:root /etc/nginx/ssl/srv.*
sudo chmod 644 /etc/nginx/ssl/srv.crt 
sudo chmod 600 /etc/nginx/ssl/srv.key 
 vi /etc/nginx/sites-available/default
 server {
    listen 443 ssl http2;
    listen [::]:443 ssl http2;

    ssl_certificate     /etc/nginx/ssl/srv.crt;
    ssl_certificate_key /etc/nginx/ssl/srv.key;

On redémarre nginx

systemctl restart nginx

On ajoute le certificat root à firefox pour tester

Et on teste l’accès au site:

Il ne devrait pas y a voir de message d’erreur de certificat !

Conclusion

Avec step-ca, il est possible de déployer rapidement une PKI interne légère adaptée aux environnements d’administration système et réseau.
La génération des certificats reste sécurisée : la clé privée est créée localement et seule la CSR est envoyée automatiquement à la PKI.

Commentaires

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *