Installation de Step-CA
👋 Présentation
Step-CA est une solution permettant de monter sa propre autorité de certification opensource. Elle est éditée et maintenue par l'entreprise Smallstep Labs.
Hébergeant un domaine de portée locale à la maison utilisé par des services web internes, j'utilisais jusqu'à présent pfSense pour générer manuellement mes certificats. Pour des services qui bougent peu, c'était peu contraignant si on paramétrait une date d'expiration de quelques années (pas très "secure" mais avec un risque tolérable pour la maison). Ça devenait plus contraignant quand je voulais tester de manière éphémaire des applications web. Beaucoup trop de tâches manuelles. C'est là qu'entre en jeu Step-CA.
Step-CA offre plein de possibilités mais celle que j'ai retenue est la fonctionnalité permettant de créer des certificats à la volée, en s'appuyant sur le protocole ACME, avec des clients comme certbot mais aussi avec le provisionneur paramétré dans Traefik.
Prérequis
- Un serveur DNS local faisant autorité sur votre nom de domaine local
- Un serveur GNU/Linux avec Docker installé pour faire tourner Step-CA
- Pour tester la génération de certificats :
- Un serveur web (apache2/Nginx) avec certbot installé
- Un serveur Proxmox VE
Installation
Installation de Step CA
Nous allons commencer par installer notre PKI sur le serveur faisant tourner Docker. Le serveur se nommera srv-stepca-lab.maison.lab. Pensez à déclarer ce nom dans votre serveur DNS local. J'ai enregistré également un CNAME plus court ca.maison.lab.
root@srv-stepca-lab:/srv# mkdir -p /srv/step-ca/datas
root@srv-stepca-lab:/srv# chown -R <VOTRE_USER> step-ca
olivier@srv-stepca-lab:~/srv/step-ca/$ vim compose.yml
services:
step-ca:
image: smallstep/step-ca
restart: unless-stopped
user: 1000:1000
environment:
# Nom de la PKI
DOCKER_STEPCA_INIT_NAME: MAISONLAB
# Déclaration des ndd
DOCKER_STEPCA_INIT_DNS_NAMES: localhost,srv-stepca-lab,srv-stepca-lab.maison.lab,ca.maison.lab
DOCKER_STEPCA_INIT_REMOTE_MANAGEMENT: true
# L'utilisateur par défaut qui sera proposé lors de l'utilisation de Step CLI
DOCKER_STEPCA_INIT_PROVISIONER_NAME: pkimaster01
# Activation du protocole ACME
DOCKER_STEPCA_INIT_ACME: true
volumes:
- "./datas:/home/step"
ports:
- 443:9000
healthcheck:
test: [ "CMD", "curl", "-k", "https://localhost:9000/health" ]
timeout: 30s
interval: 300s
retries: 6
olivier@srv-stepca-lab:~/srv/step-ca/$ docker compose up
[+] Running 2/2
✔ Network step-ca-article_default Created 0.2s
✔ Container step-ca-article-step-ca-1 Created 0.1s
Attaching to step-ca-1
step-ca-1 |
step-ca-1 | Generating root certificate... done!
step-ca-1 | Generating intermediate certificate... done!
step-ca-1 |
step-ca-1 | ✔ Root certificate: /home/step/certs/root_ca.crt
step-ca-1 | ✔ Root private key: /home/step/secrets/root_ca_key
step-ca-1 | ✔ Root fingerprint: d091900716340086305407d6bcc15769afe9007bada618b523d837af3fcea9f7
step-ca-1 | ✔ Intermediate certificate: /home/step/certs/intermediate_ca.crt
step-ca-1 | ✔ Intermediate private key: /home/step/secrets/intermediate_ca_key
step-ca-1 | badger 2024/12/07 15:52:06 INFO: All 0 tables opened in 0s
step-ca-1 | badger 2024/12/07 15:52:06 INFO: Storing value log head: {Fid:0 Len:30 Offset:3312}
step-ca-1 | badger 2024/12/07 15:52:06 INFO: [Compactor: 173] Running compaction: {level:0 score:1.73 dropPrefixes:[]} for level: 0
step-ca-1 | badger 2024/12/07 15:52:06 INFO: LOG Compact 0->1, del 1 tables, add 1 tables, took 14.081795ms
step-ca-1 | badger 2024/12/07 15:52:06 INFO: [Compactor: 173] Compaction for level: 0 DONE
step-ca-1 | badger 2024/12/07 15:52:06 INFO: Force compaction on level 0 done
step-ca-1 | ✔ Database folder: /home/step/db
step-ca-1 | ✔ Default configuration: /home/step/config/defaults.json
step-ca-1 | ✔ Certificate Authority configuration: /home/step/config/ca.json
step-ca-1 | ✔ Admin provisioner: pkimaster01 (JWK)
step-ca-1 | ✔ Super admin subject: step
step-ca-1 |
step-ca-1 | Your PKI is ready to go. To generate certificates for individual services see 'step help ca'.
step-ca-1 |
step-ca-1 | FEEDBACK 😍 🍻
step-ca-1 | The step utility is not instrumented for usage statistics. It does not phone
step-ca-1 | home. But your feedback is extremely valuable. Any information you can provide
step-ca-1 | regarding how you’re using `step` helps. Please send us a sentence or two,
step-ca-1 | good or bad at feedback@smallstep.com or join GitHub Discussions
step-ca-1 | https://github.com/smallstep/certificates/discussions and our Discord
step-ca-1 | https://u.step.sm/discord.
step-ca-1 |
step-ca-1 | 👉 Your CA administrative username is: step
step-ca-1 | 👉 Your CA administrative password is: WMtDLLawHX0Y7WaMoyhh6QwjpnZEJLfEWNWTBAPA
step-ca-1 | 🤫 This will only be displayed once.
step-ca-1 | badger 2024/12/07 15:52:06 INFO: All 1 tables opened in 1ms
step-ca-1 | badger 2024/12/07 15:52:06 INFO: Replaying file id: 0 at offset: 3342
step-ca-1 | badger 2024/12/07 15:52:06 INFO: Replay took: 4.064µs
step-ca-1 | 2024/12/07 15:52:06 Building new tls configuration using step-ca x509 Signer Interface
step-ca-1 | 2024/12/07 15:52:06 Starting Smallstep CA/0.28.1 (linux/amd64)
step-ca-1 | 2024/12/07 15:52:06 Documentation: https://u.step.sm/docs/ca
step-ca-1 | 2024/12/07 15:52:06 Community Discord: https://u.step.sm/discord
step-ca-1 | 2024/12/07 15:52:06 Config file: /home/step/config/ca.json
step-ca-1 | 2024/12/07 15:52:06 The primary server URL is https://localhost:9000
step-ca-1 | 2024/12/07 15:52:06 Root certificates are available at https://localhost:9000/roots.pem
step-ca-1 | 2024/12/07 15:52:06 Additional configured hostnames: srv-stepca-lab, srv-stepca-lab.maison.lab, ca.maison.lab
step-ca-1 | 2024/12/07 15:52:06 X.509 Root Fingerprint: d091900716340086305407d6bcc15769afe9007bada618b523d837af3fcea9f7
step-ca-1 | 2024/12/07 15:52:06 Serving HTTPS on :9000 ...
Enregistrez le "CA administrative password" et la "Root fingerprint" générés dans votre gestionnaire de mots de passe.
Stoppez le conteneur et relancez-le avec l'option "-d" permettant de faire tourner le conteneur en tâche de fond. Et voilà pour l'installation.
Installation de Step CLI
Installons maintenant Step CLI sur le serveur web.
# Récupération du paquet disponible ici
root@srv-web:~# wget https://dl.smallstep.com/cli/docs-cli-install/latest/step-cli_amd64.deb
root@srv-web:~# dpkg -i step-cli_amd64.deb
root@srv-web:~# step ca bootstrap --ca-url https://ca.maison.lab --fingerprint d091900716340086305407d6bcc15769afe9007bada618b523d837af3fcea9f7 --install
The root certificate has been saved in /root/.step/certs/root_ca.crt.
The authority configuration has been saved in /root/.step/config/defaults.json.
Installing the root certificate in the system truststore... done.
# La dernière sortie indique que le certificat racine a été installé dans le magasin de certificat.
# Nous pouvons d'ailleurs le retrouver ici.
root@srv-web:~# ls /usr/local/share/ca-certificates/
MAISONLAB_Root_CA_199520857197989213486459149214337461964.crt
Nous aurions pu aussi récupérer le certificat directement sur le serveur faisant tourner Setp CA dans le fichier root_ca.crt contenu dans le dossier /srv/step-ca/datas/certs/, le placer manuellement dans /usr/local/share/ca-certificates/ et lancer la commande update-ca-certificates
.
À partir de là nous pourrions générer le certificat de notre site web avec la commande step
.
# https://smallstep.com/docs/step-cli/reference/ca/certificate/
root@srv-web:~# step ca certificate www.maison.lab www.crt www.key
✔ Provisioner: pkimaster01 (JWK) [kid: tVNl9MsY79ukMn6SKP47RIUufmy-dOttM4WlmmyiWak]
Please enter the password to decrypt the provisioner key:
✔ CA: https://ca.maison.lab
✔ Certificate: www.crt
✔ Private Key: www.key
root@srv-web:~# ls
www.crt www.key
C'est bien mais ça demande ensuite des actions manuelles pour les déclarer dans Nginx sachant que par défaut les certificats durent 24h. C'est une option que l'on peut modifier. Cependant Step CA ne proposant pas OCSP, j'ai préféré laisser cette option par défaut. Si je stoppe définitivement un service web, son certificat ne sera pas renouvelé, aura expiré au bout de 24h et ne sera donc plus valable. Cela implique bien évidemment d'utiliser le protocole ACME afin de renouveler régulièrement et automatiquement les certificats des applications toujours en service.