Date : 2026-03-21
Auteur : Daniel Caron
Version OS : Debian 13 (Trixie)
Rôle : PKI — Autorité de certification intermédiaire CaronTech
VLAN : 1 (Management)
IP : 10.21.10.41
FQDN : whvd9999.home.carontech.net
whvd9999 héberge la CA intermédiaire CaronTech. Elle signe tous les certificats internes du lab. La Root CA est hors ligne sur un laptop Linux Mint séparé.
Root CA (offline — Laptop Linux Mint)
└── CA intermédiaire (whvd9999) ← signe les certificats serveurs
├── whvu1515-fullchain.crt
├── phhv01-fullchain.crt
├── whvu2020-fullchain.crt
└── ...
└── CRL publiée sur whvd9998 (HTTP)
Station admin Windows (sign-cert.ps1)
→ Génère CSR sur serveur cible
→ Transfère CSR → whvd9999
→ openssl ca signe le CSR
→ Fullchain déployé sur serveur cible
whvd9999| Type | Nom | Valeur |
|---|---|---|
| A | whvd9999.home.carontech.net |
10.21.10.41 |
sudo apt update && sudo apt upgrade -y
OpenSSL est généralement préinstallé. Vérifier :
openssl version
sudo mkdir -p /opt/pki/intermediate-ca/{certs,crl,csr,newcerts,private,archive,issued}
sudo touch /opt/pki/intermediate-ca/index.txt
sudo touch /opt/pki/intermediate-ca/index.txt.attr
echo 1000 | sudo tee /opt/pki/intermediate-ca/serial
echo 1000 | sudo tee /opt/pki/intermediate-ca/crlnumber
sudo chown -R root:debianadmin /opt/pki/intermediate-ca
sudo chmod -R 775 /opt/pki/intermediate-ca
sudo chmod 700 /opt/pki/intermediate-ca/private
/opt/pki/intermediate-ca/
├── archive/ (anciens certificats)
├── certs/ (certificats émis + intermediate-ca.crt)
├── crl/ (liste de révocation)
├── crlnumber (numéro séquentiel CRL)
├── csr/ (CSR temporaires)
├── index.txt (base de données certificats)
├── index.txt.attr
├── issued/
├── newcerts/ (copies des certificats émis)
├── openssl.cnf (configuration OpenSSL)
├── private/ (clé privée CA intermédiaire — chmod 700)
└── serial (numéro séquentiel certificats)
sudo nano /opt/pki/intermediate-ca/openssl.cnf
Contenu :
[ ca ]
default_ca = CA_default
[ CA_default ]
dir = /opt/pki/intermediate-ca
certs = $dir/certs
crl_dir = $dir/crl
new_certs_dir = $dir/newcerts
database = $dir/index.txt
serial = $dir/serial
private_key = $dir/private/intermediate-ca.key
certificate = $dir/certs/intermediate-ca.crt
crlnumber = $dir/crlnumber
crl = $dir/crl/intermediate-ca.crl
crl_extensions = crl_ext
default_crl_days = 365
default_md = sha256
name_opt = ca_default
cert_opt = ca_default
default_days = 825
policy = policy_loose
copy_extensions = copy
[ policy_loose ]
countryName = optional
stateOrProvinceName = optional
organizationName = optional
organizationalUnitName = optional
commonName = supplied
emailAddress = optional
[ req ]
default_bits = 4096
distinguished_name = req_distinguished_name
string_mask = utf8only
default_md = sha256
[ req_distinguished_name ]
countryName = Country Name
countryName_default = CA
organizationName = Organization Name
organizationName_default = Carontech
commonName = Common Name
commonName_max = 64
[ server_cert ]
basicConstraints = CA:FALSE
nsCertType = server
nsComment = "Carontech Server Certificate"
subjectKeyIdentifier = hash
authorityKeyIdentifier = keyid,issuer
keyUsage = critical, digitalSignature, keyEncipherment
extendedKeyUsage = serverAuth
authorityInfoAccess = caIssuers;URI:http://pki.home.carontech.net/crt/intermediate.crt
crlDistributionPoints = URI:http://pki.home.carontech.net/crl/intermediate.crl
[ crl_ext ]
authorityKeyIdentifier=keyid:always
Note : Cette étape est effectuée une seule fois lors de la création de la CA intermédiaire.
# Générer la clé privée (protégée par passphrase)
sudo openssl genrsa -aes256 \
-out /opt/pki/intermediate-ca/private/intermediate-ca.key 4096
sudo chmod 400 /opt/pki/intermediate-ca/private/intermediate-ca.key
# Générer le CSR
sudo openssl req -new -sha256 \
-config /opt/pki/intermediate-ca/openssl.cnf \
-key /opt/pki/intermediate-ca/private/intermediate-ca.key \
-out /opt/pki/intermediate-ca/csr/intermediate-ca.csr
⚠️ Cette étape est effectuée sur le laptop Linux Mint hors ligne.
La procédure exacte est à retrouver dans les notes de création de la PKI.
À compléter — voir anciennes conversations Claude.
Le CSR est transféré vers le laptop Linux Mint, signé par la Root CA, puis le certificat intermediate-ca.crt est rapatrié sur whvd9999 :
# Copier le certificat signé sur whvd9999
sudo cp intermediate-ca.crt /opt/pki/intermediate-ca/certs/intermediate-ca.crt
sudo chmod 444 /opt/pki/intermediate-ca/certs/intermediate-ca.crt
sudo openssl ca \
-config /opt/pki/intermediate-ca/openssl.cnf \
-gencrl \
-out /opt/pki/intermediate-ca/crl/intermediate-ca.crl
La CRL est régénérée automatiquement chaque jour à 02:00 et publiée sur whvd9998 (serveur HTTP).
cat /etc/cron.d/generate-crl
0 2 * * * root /usr/local/bin/generate-crl.sh
sudo cat /usr/local/bin/generate-crl.sh
À documenter — contenu exact du script à ajouter ici.
sudo systemctl status cron
sudo cat /etc/cron.d/generate-crl
#!/bin/bash
# generate-crl.sh
# Génération CRL - intermediate CA carontech.net
set -e
# Adapter ces variables à ton environnement
CA_DIR="/opt/pki/intermediate-ca" # <-- répertoire de la CA intermédiaire
CRL_OUTPUT="${CA_DIR}/crl/intermediate.crl"
CA_CERT="${CA_DIR}/certs/intermediate.cert.pem"
CA_KEY="${CA_DIR}/private/intermediate.key.pem"
CA_CONFIG="${CA_DIR}/openssl.cnf"
CRL_DAYS=30 # validité de la CRL en jours
echo "[$(date)] Génération CRL intermédiaire..."
# Générer la CRL
openssl ca \
-config ${CA_CONFIG} \
-gencrl \
-crldays ${CRL_DAYS} \
-out ${CRL_OUTPUT}.pem
# Convertir en DER si nécessaire (certains clients Windows l'exigent)
openssl crl \
-in ${CRL_OUTPUT}.pem \
-outform DER \
-out ${CRL_OUTPUT}
# Vérifier la CRL générée
openssl crl \
-in ${CRL_OUTPUT} \
-inform DER \
-noout -text | grep -E "Next Update|This Update|Issuer"
echo "[$(date)] CRL générée avec succès : ${CRL_OUTPUT}"
# Vérifier que le fichier n'est pas vide
if [ ! -s "${CRL_OUTPUT}" ]; then
echo "[$(date)] ERREUR : fichier CRL vide !"
exit 1
fi
Les certificats sont émis via le script sign-cert.ps1 depuis la station admin Windows.
# Depuis station admin Windows
.\sign-cert.ps1 -server <hostname> -verbose
Voir Runbook — Émission certificat pour la procédure complète.
| Serveur | Serial | Expiry | SANs |
|---|---|---|---|
phhv01 |
à documenter | à documenter | phhv01.home.carontech.net, proxmox.home.carontech.net |
whvu1515 |
0x1002 | 2027-04-23 | whvu1515.home.carontech.net, wiki.carontech.net, photos.carontech.net |
whvu2020 |
à documenter | à documenter | whvu2020.home.carontech.net, immich.home.carontech.net |
Vérifier l'index complet :
cat /opt/pki/intermediate-ca/index.txt
Un cron envoie une alerte 30 jours avant l'expiration de chaque certificat.
**À mettre en place.
openssl x509 -in /opt/pki/intermediate-ca/certs/<hostname>.crt -noout -text
openssl x509 -in /opt/pki/intermediate-ca/certs/<hostname>.crt -noout -enddate
openssl x509 -in /opt/pki/intermediate-ca/certs/<hostname>.crt -noout -text | grep -A1 'Subject Alternative Name'
cat /opt/pki/intermediate-ca/index.txt
openssl crl -in /opt/pki/intermediate-ca/crl/intermediate-ca.crl -noout -text
openssl x509 -in /opt/pki/intermediate-ca/certs/intermediate-ca.crt -noout -text
| Source | Destination | Port | Action |
|---|---|---|---|
| Station admin (VPN-Admin 99) | whvd9999 (VLAN 1) |
22 | Allow |
Note :
whvd9999n'est accessible que depuis la station admin via SSH — aucun autre accès entrant requis. Le scriptsign-cert.ps1s'y connecte via SSH pour signer les certificats.
phhv01-fullchain.crt à la racine de /opt/pki/intermediate-ca/ est vide (0 bytes) — résidu à nettoyer| Priorité | Amélioration | Notes |
|---|---|---|
| 🔴 Haute | Documenter la procédure Root CA | Retrouver dans anciennes conversations Claude |
| 🔴 Haute | Mettre en place alerte pour expiration des certificat | Ajouter dans CRON |
| 🔴 Haute | Documenter le cron d'alerte expiration | Ajouter les détails |
| 🟡 Moyenne | Nettoyer phhv01-fullchain.crt vide | Résidu à supprimer |
| 🟡 Moyenne | Renouveler certificat phhv01 | Vérifier si toujours valide |