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.
Laisser un commentaire