PKI autorité certification locale
Introduction⚓︎
Avant-propos⚓︎
Contrairement aux approches traditionnelles qui sécurisent principalement les entrées (pare-feu) et font confiance à tout ce qui est à l'intérieur, le Zero Trust part du principe que la menace peut être partout, y compris à l'intérieur du réseau. Dans cette optique, si un attaquant est déjà dans le réseau, il serait de bon ton que tout le traffic interne soit chiffré, y compris entre le proxy et les conteneurs: c'est ici que step-ca intervient en nous permettant de déployer une Private Key Infrastruture - PKI - avec renouvellement des certificats automatique et chiffrement mTLS entre les points d'exposition.
C'est quoi ?⚓︎
Step-ca est un ensemble d'utilitaire pour gérer et administrer une infrastructure de clefs privées automatisée.
Elle se défini elle-même par :
Step-ca est une autorité de certification (CA) en ligne qui permet une gestion sécurisée et automatisée des certificats X.509 et SSH. Il s'agit de l'équivalent serveur de step CLI. Il est sécurisé par TLS et offre plusieurs fournisseurs de certificats configurables, des modèles de certificats flexibles et des bases de données backend enfichables pour s'adapter à une grande variété de contextes et de flux de travail.
Avantages & inconvénients⚓︎
- Chiffrement intégral des communications conteneurs-proxy
- Le renouvellement des certificats SSL est automatique
- Le mTLS (mutual TLS) tend à devenir le standard
- On peut aussi générer des certificats SSH
- Malgré son aspect clef-en-main, les concepts de certificat sont complexes à prendre en main
- Les certificats ne sont valides que localement
- Le déploiement du mTLS augmente la complexité et la maintenabilité d'une infra
Alternatives⚓︎
L'alternative la plus courante est d'utiliser, plus simplement, des certificats Let's Encrypt mais elle ne permet plus de faire du mTLS.
Installation⚓︎
Prérequis⚓︎
Une LXC ou une machine virtuelle, qui ne servira QUE pour ça, très légère (512 Mo de DDR suffiront) sous debian, et quelques paquets utilitaires :
Méthode recommandée : bare-metal⚓︎
Sous debian (et dérivées), un mini-script disponible sur le site de smallstep permet d'ajouter le dépôt officiel et d'installer la dernière version :
curl -fsSL https://packages.smallstep.com/keys/apt/repo-signing-key.gpg -o /etc/apt/keyrings/smallstep.asc
cat << EOF > /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
EOF
apt-get update && apt-get -y install step-cli step-ca
step version qui devrait renvoyer : Smallstep CLI/0.29.0 (linux/amd64) (le numéro de version peut varier).
Configuration et génération des certificats⚓︎
On commence par initialiser notre PKI
Bonnes pratiques !
On crée un utilisateur dédié avec des permissions limitées : principe du moindre privilège. Jamais en root !
# Créer un utilisateur dédié
useradd --system --home /etc/step-ca --shell /bin/false step
# Initialiser la CA en tant qu'utilisateur step
su - step
export STEPPATH=/etc/step-ca
# Adapter les valeurs, évidemment
step ca init \
--name="DOMAIN Internal CA" \
--dns="acme.domain.internal" \
--address=":443" \
--provisioner="admin@domain.internal" \
--password-file=<(echo "CHANGEZ_CE_MOT_DE_PASSE_FORT") \
--remote-management
Password
Le mot de passe choisi DOIT rester secret. Si ce password est compris, c'est toute la PKI qui l'est !
La sortie devrait être du type :
Generating root certificate... done!
Generating intermediate certificate... done!
✔ Root certificate: /etc/step-ca/certs/root_ca.crt
✔ Root private key: /etc/step-ca/secrets/root_ca_key
✔ Root fingerprint: *REDACTED*
✔ Intermediate certificate: /etc/step-ca/certs/intermediate_ca.crt
✔ Intermediate private key: /etc/step-ca/secrets/intermediate_ca_key
badger 2026/02/15 12:07:15 INFO: All 0 tables opened in 0s
badger 2026/02/15 12:07:15 INFO: Storing value log head: {Fid:0 Len:30 Offset:2949}
badger 2026/02/15 12:07:15 INFO: [Compactor: 173] Running compaction: {level:0 score:1.73 dropPrefixes:[]} for level: 0
badger 2026/02/15 12:07:15 INFO: LOG Compact 0->1, del 1 tables, add 1 tables, took 10.672593ms
badger 2026/02/15 12:07:15 INFO: [Compactor: 173] Compaction for level: 0 DONE
badger 2026/02/15 12:07:15 INFO: Force compaction on level 0 done
✔ Database folder: /etc/step-ca/db
✔ Default configuration: /etc/step-ca/config/defaults.json
✔ Certificate Authority configuration: /etc/step-ca/config/ca.json
✔ Admin provisioner: admin@domain.internal (JWK)
✔ Super admin subject: step
Your PKI is ready to go. To generate certificates for individual services see 'step help ca'.
Maintenant que notre PKI est prête, on va déployer ACME pour la génération automatique de certificats.
Qui doit renvoyer :✔ CA Configuration: /etc/step-ca/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.
On a un fichier de configuration disponible sur /etc/step-ca/config/ca.json. On va le modifier en utilisant la commande jq afin de fusionner deux fichiers en les concaténant.
On crée d'abord un fichier en plus :
cat > /etc/step-ca/config/ca.json.new << 'EOF'
{
"root": "/etc/step-ca/certs/root_ca.crt",
"federatedRoots": null,
"crt": "/etc/step-ca/certs/intermediate_ca.crt",
"key": "/etc/step-ca/secrets/intermediate_ca_key",
"address": ":443",
"dnsNames": [
"acme.domain.internal"
],
"logger": {
"format": "text"
},
"db": {
"type": "badgerv2",
"dataSource": "/etc/step-ca/db",
"badgerFileLoadingMode": "FileIO"
},
"authority": {
"enableAdmin": true,
"provisioners": []
},
"tls": {
"cipherSuites": [
"TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256",
"TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256",
"TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384",
"TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384",
"TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256",
"TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256"
],
"minVersion": 1.2,
"maxVersion": 1.3,
"renegotiation": false
}
}
EOF
# Fusionner la configuration
jq -s '.[0] * .[1]' /etc/step-ca/config/ca.json /etc/step-ca/config/ca.json.new > /etc/step-ca/config/ca.json.tmp
# Configuration des durées de certificats (28j par défaut, max 1 an)
step ca provisioner update acme --x509-default-dur=672h --x509-max-dur=8760h
On sort de l'utilisateur step avec exit pour créer le service systemd en root.
cat > /etc/systemd/system/step-ca.service << 'EOF'
[Unit]
Description=smallstep Certificate Authority
Documentation=https://smallstep.com/docs/step-ca
After=network-online.target
Wants=network-online.target
[Service]
Type=simple
User=step
Group=step
Environment=STEPPATH=/etc/step-ca
WorkingDirectory=/etc/step-ca
ExecStart=/usr/bin/step-ca config/ca.json --password-file /etc/step-ca/secrets/password
Restart=on-failure
RestartSec=10
StandardOutput=append:/var/log/step-ca/output.log
StandardError=append:/var/log/step-ca/error.log
# Sécurité
NoNewPrivileges=true
PrivateTmp=true
ProtectSystem=full
ProtectHome=true
ReadWritePaths=/etc/step-ca/db
[Install]
WantedBy=multi-user.target
EOF
mkdir -p /etc/step-ca/secrets
echo "CHANGEZ_CE_MOT_DE_PASSE_FORT" > /etc/step-ca/secrets/password
chmod 600 /etc/step-ca/secrets/password
chown step:step /etc/step-ca/secrets/password