🔒 Sécurité

Créer une CA locale et gérer ses certificats SSL

📅 16 juin 202512 min de lecture
ssldebiandocker

CA locale vs certificat auto-signé

⚠️ Certificat auto-signé

Un certificat auto-signé est généré et signé par lui-même, sans autorité de confiance. Le navigateur affiche un avertissement à chaque accès. C'est rapide mais peu pratique dès qu'on a plusieurs services.

✅ CA locale (recommandée)

On crée une autorité de certification locale. On l'installe une seule fois dans Windows comme autorité de confiance — tous les certificats qu'elle signe seront automatiquement approuvés par les navigateurs, sans avertissement.

1. Structure de dossiers

sudo mkdir -p /opt/ssl/{current,requests,config,archive}
# current : accessible en lecture (Traefik y accède)
sudo chmod 755 /opt/ssl/current/
 
# config : lisible par tous
sudo chmod 755 /opt/ssl/config/
 
# requests et archive : contiennent des clés privées
sudo chmod 700 /opt/ssl/requests/
sudo chmod 700 /opt/ssl/archive/

Ces dossiers contiennent les clés privées. Si un attaquant y accède, il peut déchiffrer tout le trafic HTTPS. 700 signifie que seul le propriétaire peut lire, écrire et accéder à ces dossiers.

Vérification : ls -la /opt/ssl/

2. Fichier de configuration SSL

sudo nano /opt/ssl/config/ssl_cert.conf
[req]
default_bits = 2048
prompt = no
distinguished_name = req_distinguished_name
req_extensions = v3_req
 
[req_distinguished_name]
C=FR
ST=HDF
L=Lille
O=Ignis Fox
OU=Ignis
CN=docker-ignis
 
[v3_req]
basicConstraints = CA:FALSE
keyUsage = nonRepudiation, digitalSignature, keyEncipherment
subjectAltName = @alt_names
 
[alt_names]
DNS.1 = traefik.ignis.fr
DNS.2 = ignis-fox.fr

Les navigateurs modernes ignorent le champ CN pour valider le domaine — ils ne regardent que les alt_names. Ajoutez ici tous vos domaines (DNS.3, DNS.4, etc.).

3. Création de la CA locale

3.1 Générer la clé privée de la CA

sudo openssl genrsa -out /opt/ssl/archive/ca.key 4096

On utilise 4096 bits pour la CA car sa clé signe tous les autres certificats. Elle mérite d'être plus robuste que les certificats serveur (2048 bits suffisent pour ces derniers).

3.2 Générer le certificat racine de la CA

sudo openssl req -new -x509 -days 3650 \
  -key /opt/ssl/archive/ca.key \
  -out /opt/ssl/archive/ca.crt \
  -subj "/C=FR/ST=HDF/L=Lille/O=Ignis Fox/OU=Ignis/CN=Ignis-CA"

3650 jours (10 ans) est raisonnable pour une CA locale. Cette limitation de durée ne s'applique pas aux CA — seuls les certificats serveur sont limités à 825 jours.

Vérification : openssl x509 -in /opt/ssl/archive/ca.crt -text -noout | grep -E "Issuer|Not"

4. Génération du certificat serveur

4.1 Clé privée serveur

sudo openssl genrsa -out /opt/ssl/archive/docker-ignis.key 2048

4.2 Demande de signature (CSR)

sudo openssl req -new \
  -key /opt/ssl/archive/docker-ignis.key \
  -out /opt/ssl/requests/docker-ignis.csr \
  -config /opt/ssl/config/ssl_cert.conf

4.3 Signer avec la CA

sudo openssl x509 -req -days 825 \
  -in /opt/ssl/requests/docker-ignis.csr \
  -CA /opt/ssl/archive/ca.crt \
  -CAkey /opt/ssl/archive/ca.key \
  -CAcreateserial \
  -out /opt/ssl/archive/docker-ignis.crt \
  -extensions v3_req \
  -extfile /opt/ssl/config/ssl_cert.conf

Les navigateurs modernes refusent les certificats serveur valables plus de 825 jours. Ne dépassez pas cette limite, même si openssl l'accepte.

5. Déploiement dans current/

sudo cp /opt/ssl/archive/docker-ignis.crt /opt/ssl/current/
sudo cp /opt/ssl/archive/docker-ignis.key /opt/ssl/current/

6. Récupérer la CA vers Windows

Option 1 — Copier sur le bureau

cp /opt/ssl/archive/ca.crt /mnt/c/Users/<VotreUser>/Desktop/ca.crt

Option 2 — Via l'explorateur Windows

Dans la barre d'adresse de l'explorateur, tapez :

\\wsl$\Debian\opt\ssl\archive

Option 3 — Via PowerShell

cp \\wsl$\Debian\opt\ssl\archive\ca.crt $env:USERPROFILE\Desktop\ca.crt

7. Installer la CA dans Windows

Via l'interface graphique

  1. Double-clic sur ca.crt
  2. Cliquer sur Installer le certificat
  3. Sélectionner Machine locale
  4. Choisir Placer tous les certificats dans le magasin suivant
  5. Parcourir → Autorités de certification racines de confiance
  6. Terminer

Via PowerShell (en administrateur)

Import-Certificate -FilePath "$env:USERPROFILE\Desktop\ca.crt" -CertStoreLocation Cert:\LocalMachine\Root

Firefox a son propre magasin de certificats et n'utilise pas celui de Windows. Paramètres → Confidentialité et sécurité → Certificats → Voir les certificats → Autorités → Importer.

8. Renouvellement

Quand un certificat approche des 825 jours, régénérez-le sans toucher à la CA :

sudo openssl genrsa -out /opt/ssl/archive/docker-ignis.key 2048
sudo openssl req -new \
  -key /opt/ssl/archive/docker-ignis.key \
  -out /opt/ssl/requests/docker-ignis.csr \
  -config /opt/ssl/config/ssl_cert.conf
 
sudo openssl x509 -req -days 825 \
  -in /opt/ssl/requests/docker-ignis.csr \
  -CA /opt/ssl/archive/ca.crt \
  -CAkey /opt/ssl/archive/ca.key \
  -CAcreateserial \
  -out /opt/ssl/archive/docker-ignis.crt \
  -extensions v3_req \
  -extfile /opt/ssl/config/ssl_cert.conf
 
sudo cp /opt/ssl/archive/docker-ignis.crt /opt/ssl/current/
sudo cp /opt/ssl/archive/docker-ignis.key /opt/ssl/current/

Commandes utiles

# Vérifier la date d'expiration
openssl x509 -in /opt/ssl/current/docker-ignis.crt -noout -dates
 
# Vérifier qu'un certificat est bien signé par la CA
openssl verify -CAfile /opt/ssl/archive/ca.crt /opt/ssl/current/docker-ignis.crt
 
# Voir tous les détails
openssl x509 -in /opt/ssl/current/docker-ignis.crt -text -noout
 
# Vérifier que la clé correspond au certificat (les deux hash doivent être identiques)
openssl x509 -noout -modulus -in /opt/ssl/current/docker-ignis.crt | md5sum
openssl rsa  -noout -modulus -in /opt/ssl/current/docker-ignis.key | md5sum
 
# Lister les certificats Ignis dans Windows (PowerShell)
Get-ChildItem Cert:\LocalMachine\Root | Where-Object { $_.Subject -like "*Ignis*" }

Erreurs fréquentes

ErreurCauseSolution
unable to load CA Private KeyMauvais chemin ou permissionsVérifier le chemin et sudo chmod 600 ca.key
Navigateur affiche un avertissementCA pas installée ou mauvais magasinVérifier dans "Autorités de certification racines de confiance"
certificate has expiredCertificat dépassé les 825 joursRenouveler (section 8)
Firefox ne fait pas confianceFirefox a son propre magasinImporter manuellement dans les paramètres Firefox
SAN manquantsalt_names absentsVérifier ssl_cert.conf et régénérer le CSR