mirror of
https://github.com/tips-of-mine/gestion-certificats2.git
synced 2025-06-28 13:58:42 +02:00
![google-labs-jules[bot]](/assets/img/avatar_default.png)
Ce commit adresse plusieurs problèmes qui empêchaient la création correcte des périmètres fonctionnels et de leurs certificats intermédiaires associés. Modifications apportées : 1. **Scripts Shell (create_root_cert.sh, create_intermediate_cert.sh):** * Correction des chemins de copie pour les fichiers de configuration OpenSSL (`root-openssl.conf`, `intermediate-openssl.conf`) pour utiliser `/opt/scripts/configs/` comme source correcte dans l'environnement d'exécution. * Ajout de `set -e` au début des scripts pour un arrêt immédiat en cas d'erreur. * Modification de `scripts/configs/root-openssl.conf` pour que sa directive `dir` pointe vers `/opt/tls/root`, assurant que la CA Racine trouve correctement ses propres fichiers. * Modification de `scripts/create_intermediate_cert.sh` pour que la directive `dir` dans les fichiers `openssl.cnf` des CA intermédiaires soit dynamiquement ajustée au chemin spécifique du périmètre (ex: `/opt/tls/intermediate/nom_perimetre`). * `create_intermediate_cert.sh` accepte maintenant `ROOT_DOMAIN` comme argument et l'utilise pour rendre uniques les CN des certificats intermédiaires et OCSP (ex: `nom_perimetre.intermediate.example.com`). * Correction des chemins de sortie pour la CRL et les fichiers OCSP (clé privée et CSR) dans `create_intermediate_cert.sh` pour utiliser `$INTERMEDIATE_CA_DIR` comme base. 2. **Contrôleur PHP (PerimeterController.php):** * Extraction dynamique du `ROOT_DOMAIN` à partir du CN du certificat de la CA Racine existante et passage de cette valeur au script `create_intermediate_cert.sh`. * Utilisation d'une expression régulière plus robuste pour l'extraction du `ROOT_DOMAIN`. * Passage des variables d'environnement `OCSP_URL` (depuis la configuration PHP) et `SAN` (vide) au script `create_intermediate_cert.sh` pour éviter les erreurs de "variable has no value" dans OpenSSL. 3. **Initialisation (app/public/index.php):** * Ajout de logs de débogage et d'une gestion d'erreur défensive pour s'assurer que `$_SESSION['init_root_domain']` est correctement défini avant d'être utilisé pour créer la CA Racine. Ces changements combinés résolvent le problème initial de création de certificat intermédiaire et plusieurs autres problèmes découverts, menant à une création réussie des périmètres fonctionnels.
100 lines
4.3 KiB
Bash
100 lines
4.3 KiB
Bash
#!/bin/bash
|
|
set -e
|
|
|
|
# Ce script crée un certificat CA intermédiaire signé par le Root CA.
|
|
# Il est appelé par l'application PHP lors de la création d'un nouveau "périmètre fonctionnel".
|
|
|
|
# Arguments :
|
|
# $1: Nom du périmètre fonctionnel (utilisé comme nom du dossier et dans le CN du certificat)
|
|
# $2: (Optionnel) Phrase secrète pour la clé privée de l'intermédiaire
|
|
# $3: Domaine racine (ex: exemple.com)
|
|
|
|
FUNCTIONAL_PERIMETER_NAME="$1"
|
|
INTERMEDIATE_KEY_PASSPHRASE="$2" # Optional, can be empty string if no passphrase
|
|
ROOT_DOMAIN="$3"
|
|
|
|
if [ -z "$FUNCTIONAL_PERIMETER_NAME" ] || [ -z "$ROOT_DOMAIN" ]; then
|
|
echo "Usage: $0 <functional_perimeter_name> <key_passphrase|EMPTY_STRING> <root_domain>"
|
|
echo "Error: Functional perimeter name and root domain are required."
|
|
exit 1
|
|
fi
|
|
# If INTERMEDIATE_KEY_PASSPHRASE is the literal "EMPTY_STRING", set it to an actual empty string.
|
|
if [ "$INTERMEDIATE_KEY_PASSPHRASE" == "EMPTY_STRING" ]; then
|
|
INTERMEDIATE_KEY_PASSPHRASE=""
|
|
fi
|
|
|
|
ROOT_CA_DIR="/opt/tls/root"
|
|
INTERMEDIATE_CA_DIR="/opt/tls/intermediate/$FUNCTIONAL_PERIMETER_NAME"
|
|
INTERMEDIATE_KEY="$INTERMEDIATE_CA_DIR/private/intermediate.key.pem"
|
|
INTERMEDIATE_CSR="$INTERMEDIATE_CA_DIR/csr/intermediate.csr.pem"
|
|
INTERMEDIATE_CERT="$INTERMEDIATE_CA_DIR/certs/intermediate.cert.pem"
|
|
INTERMEDIATE_CHAIN="$INTERMEDIATE_CA_DIR/certs/ca-chain.cert.pem"
|
|
INTERMEDIATE_CNF="$INTERMEDIATE_CA_DIR/openssl.cnf"
|
|
|
|
ROOT_CERT="$ROOT_CA_DIR/certs/ca.cert.pem"
|
|
ROOT_KEY="$ROOT_CA_DIR/private/ca.key.pem"
|
|
ROOT_CNF="$ROOT_CA_DIR/openssl.cnf"
|
|
|
|
echo "Démarrage de la création du certificat Intermédiaire pour '$FUNCTIONAL_PERIMETER_NAME'..."
|
|
|
|
# Créer les dossiers nécessaires pour la PKI Intermédiaire
|
|
mkdir -p "$INTERMEDIATE_CA_DIR/certs" "$INTERMEDIATE_CA_DIR/crl" "$INTERMEDIATE_CA_DIR/newcerts" "$INTERMEDIATE_CA_DIR/private" "$INTERMEDIATE_CA_DIR/csr"
|
|
|
|
# Copier le fichier de configuration OpenSSL pour l'intermédiaire
|
|
cp /opt/scripts/configs/intermediate-openssl.conf "$INTERMEDIATE_CNF"
|
|
|
|
# Adjust the 'dir' variable in the copied OpenSSL config to point to the specific intermediate CA directory
|
|
sed -i "s|^dir\s*=\s*/opt/tls/intermediate.*|dir = $INTERMEDIATE_CA_DIR|" "$INTERMEDIATE_CNF"
|
|
|
|
# Initialiser les fichiers requis par OpenSSL pour une CA intermédiaire
|
|
chmod 700 "$INTERMEDIATE_CA_DIR/private"
|
|
touch "$INTERMEDIATE_CA_DIR/index.txt"
|
|
|
|
#
|
|
echo 1000 > "$INTERMEDIATE_CA_DIR/serial"
|
|
echo 1000 > "$INTERMEDIATE_CA_DIR/crlnumber"
|
|
|
|
#
|
|
touch "$INTERMEDIATE_CA_DIR/certs.db"
|
|
|
|
# Générer la clé privée de l'Intermédiaire CA (avec ou sans passphrase)
|
|
if [ -n "$INTERMEDIATE_KEY_PASSPHRASE" ]; then
|
|
openssl genrsa -aes256 -passout pass:"$INTERMEDIATE_KEY_PASSPHRASE" -out "$INTERMEDIATE_KEY" 4096
|
|
else
|
|
openssl genrsa -out "$INTERMEDIATE_KEY" 4096
|
|
fi
|
|
chmod 400 "$INTERMEDIATE_KEY"
|
|
|
|
# Générer la CSR (Certificate Signing Request) pour l'Intermédiaire CA
|
|
openssl req -new -sha256 \
|
|
-key "$INTERMEDIATE_KEY" $([ -n "$INTERMEDIATE_KEY_PASSPHRASE" ] && echo "-passin pass:\"$INTERMEDIATE_KEY_PASSPHRASE\"") \
|
|
-out "$INTERMEDIATE_CSR" \
|
|
-subj "/C=FR/ST=NORD/L=ROUBAIX/O=IT/OU=IT/emailAddress=sec@tips-mine.com/CN=$FUNCTIONAL_PERIMETER_NAME.intermediate.$ROOT_DOMAIN/" \
|
|
-config "$INTERMEDIATE_CNF" # Utilise le CNF de l'intermédiaire pour la création de la CSR
|
|
|
|
# Signer la CSR de l'Intermédiaire avec le Root CA
|
|
openssl ca -batch -config "$ROOT_CNF" -extensions v3_intermediate_ca -days 3650 -notext -md sha256 \
|
|
-in "$INTERMEDIATE_CSR" \
|
|
-out "$INTERMEDIATE_CERT"
|
|
|
|
chmod 444 "$INTERMEDIATE_CERT"
|
|
|
|
# Créer le fichier de chaîne de certificats (Intermediate + Root)
|
|
cat "$INTERMEDIATE_CERT" "$ROOT_CERT" > "$INTERMEDIATE_CHAIN"
|
|
chmod 444 "$INTERMEDIATE_CHAIN"
|
|
|
|
# Create a Certificate revocation list of the intermediate CA
|
|
openssl ca -config "$INTERMEDIATE_CNF" -gencrl -out "$INTERMEDIATE_CA_DIR/crl/intermediate.crl.pem"
|
|
|
|
# Create OSCP key pair
|
|
openssl genrsa -out "$INTERMEDIATE_CA_DIR/private/ocsp.key.pem" 4096
|
|
|
|
# Create the OSCP CSR
|
|
openssl req -new -sha256 \
|
|
-key "$INTERMEDIATE_CA_DIR/private/ocsp.key.pem" \
|
|
-out "$INTERMEDIATE_CA_DIR/csr/ocsp.csr.pem" -nodes \
|
|
-subj "/C=FR/ST=NORD/L=ROUBAIX/O=IT/OU=IT/emailAddress=sec@tips-mine.com/CN=$FUNCTIONAL_PERIMETER_NAME.ocsp.$ROOT_DOMAIN/"\
|
|
-config "$INTERMEDIATE_CNF"
|
|
|
|
echo "Certificat Intermédiaire CA pour '$FUNCTIONAL_PERIMETER_NAME' créé : $INTERMEDIATE_CERT"
|