Aller au contenu

Installation de Step-CA

logo

👋 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.

Création du répertoire de travail
root@srv-stepca-lab:/srv# mkdir -p /srv/step-ca/datas
root@srv-stepca-lab:/srv# chown -R <VOTRE_USER> step-ca
Configuration du CT Docker

Configuration du /srv/step-ca/compose.yml
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
Il ne reste plus qu'à initialiser le conteneur mais sans l'option detach afin de récupérer le mot de passe qui servira pour la clé privée "root_ca_key" et le provisionneur "Remote Provisioner Management". Ce mot de passe nous sera utile lorsque nous utiliserons Step CLI.

Initialisation du conteneur
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.

Installation de Step CLI et du certificat racine
# 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.

Génération du certificat avec Step CLI
# 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.