Dans un environnement fermé comme un homelab, il est commun d’avoir recours à des certificats autosignés, ce qui n’est jamais idéal. Step CA permet de devenir sa propre autorité de certification, de manière simple, sécurisée et automatisable.

Mise en place de la CA

Installation

Installer la CLI selon l’architecture, par exemple armv7 :

wget https://dl.smallstep.com/gh-release/cli/gh-release-header/v0.28.6/step_linux_0.28.6_armv7.tar.gz

tar -xf step_linux_0.28.6_armv7.tar.gz
sudo mv step*/step /usr/local/bin/

Voir les différentes versions disponibles : GitHub - smallstep/cli

Télécharger et exécuter l’image :

docker pull smallstep/step-ca
docker run -it -u <step_ca_user_id> -v ./data:/home/step smallstep/step-ca step ca init

Remplir les différents champs proposés :

✔ What would you like to name your new PKI? (e.g. Smallstep): Smallstep
✔ What DNS names or IP addresses would you like to add to your new CA? (e.g. ca.smallstep.com[,1.1.1.1,etc.]): localhost
✔ What address will your new CA listen at? (e.g. :443): :9000
✔ What would you like to name the first provisioner for your new CA? (e.g. [email protected]): [email protected]
✔ What do you want your password to be? [leave empty and we'll generate one]:

Explications :

  • Nom de la CA
  • Nom DNS pris en compte
  • Port d’écoute de la CA (9000 par défaut)
  • Nom de l’admin de la CA
  • Mot de passe

Dans le volume $PATH/data monté dans le conteneur step-ca, créez le fichier ./data/secrets/password et ajoutez le mot de passe de la CA. Cette étape est obligatoire pour le démarrage du conteneur.

Ensuite, il suffira d’exécuter le conteneur de la CA :

docker run -d -u <step-ca_user_id> -p 9000:9000 -v ./data:/home/step smallstep/step-ca

Cas particulier sur Raspberry pi où une erreur s’affiche :

badger 2025/03/19 18:53:50 INFO: All 0 tables opened in 0s
Error opening database of Type badgerv2: error opening Badger database: During db.vlog.open: Error while creating log file in valueLog.open: Mmap value log file. Path=/home/step/db/000000.vlog. Error=cannot allocate memory

La Solution est d’éditer le fichier config/ca.json dans le volume avec vim et de modifier les lignes qui concernent la base de données :

{
...
    "db": {
          "type": "badgerv2",
          "dataSource": "/home/step/db",
          "badgerFileLoadingMode": "FileIO"
    },
...
}

Cela est également possible via docker compose :

services:
  step-ca:
    user: "<step-ca_user_id>
    image: smallstep/step-ca
    ports:
      - 9000:9000
    restart: always
    volumes:
      - ./data:/home/step

Récupérer la CA

Récupérez la CA sur l’hôte docker (présente aussi sous $step-ca-path/data/certs/) :

CA_FINGERPRINT=$(docker run -u <step-ca_user_id> -v ./data:/home/step smallstep/step-ca step certificate fingerprint /home/step/certs/root_ca.crt)

step ca bootstrap --ca-url https://localhost:9000 --fingerprint $CA_FINGERPRINT

Ajouter le certificat Root CA au système

Sous Linux (Debian, Ubuntu) :

sudo cp ~/step-ca-root.crt /usr/local/share/ca-certificates/step-ca.crt
sudo update-ca-certificates

Sous RHEL, Centos ou Fedora :

sudo cp ~/step-ca-root.crt /etc/pki/ca-trust/source/anchors/step-ca.crt
sudo update-ca-trust

Sous macOS :

sudo security add-trusted-cert -d -r trustRoot -k /Library/Keychains/System.keychain ~/step-ca-root.crt

Sous Windows :

  • Ouvrir certlm.msc (via Win + R)
  • Se rendre dans “Autorités de certification racines de confiance” et “Certificats”.
  • Via clic droit → “Toutes les tâches” puis “Importer”.
  • Sélectionner le fichier de la Root CA puis valider.

Vérification

Après l’ajout du certificat, il reste à tester le bon fonctionnement de la CA :

curl -v https://localhost:9000

Réponse attendue :

{"status":"ok"}

Obtenir un certificat depuis la CA

Afin d’obtenir un certificat depuis la CA on utilise :

step ca certificate svc.example.com svc.crt svc.key

Cette commande génère une clé privée (.key) et un certificat (.crt) signé par la CA.

Par défaut les certificats ne sont valides que 24 heures. Pour augmenter la durée de validité, il faut ajouter le paramètre suivant dans config/ca.json :

 "authority": {
	"provisioners": [
		...        
	],
	"claims": {
		"minTLSCertDuration": "5m",
		"maxTLSCertDuration": "2190h",
		"defaultTLSCertDuration": "2190h"
	}
}

La validité doit être définie en heures : 2190h équivaut à 3 mois.

Renouveler un certificat

Renouvellement manuel

Lorsqu’il est expiré, on peut renouveler un certificat avec la commande suivante :

step ca renew svc.crt svc.key

Il est possible de renouvellement un certificat en forçant la réécriture des fichiers .crt et .key :

step ca renew --force svc.crt svc.key

Renouvellement automatique

Renouvellement via un daemon

Utilisation de la commande suivante :

step ca renew --daemon --renew-period 24h svc.crt svc.key

D’autres techniques seront abordées prochainement pour automatiser le renouvellement des certificats :

  • Renouvellement via un cron
  • ACME (Automated Certificate Management Environment)

Références