Files
gestion-certificats2/scripts/create_intermediate_cert.sh
2025-06-14 19:03:54 +02:00

137 lines
5.1 KiB
Bash

#!/bin/bash
# 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
FUNCTIONAL_PERIMETER_NAME="$1"
INTERMEDIATE_KEY_PASSPHRASE="$2" # Optionnel
if [ -z "$FUNCTIONAL_PERIMETER_NAME" ]; then
echo "Usage: $0 <functional_perimeter_name> [key_passphrase]"
exit 1
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"
# Initialiser les fichiers requis par OpenSSL pour une CA intermédiaire
touch "$INTERMEDIATE_CA_DIR/index.txt"
echo 1000 > "$INTERMEDIATE_CA_DIR/serial"
echo 1000 > "$INTERMEDIATE_CA_DIR/crlnumber"
# Créer le fichier openssl.cnf pour le CA Intermédiaire
cat <<EOF > "$INTERMEDIATE_CNF"
[ ca ]
default_ca = CA_default
[ CA_default ]
dir = $INTERMEDIATE_CA_DIR
certs = \$dir/certs
crl_dir = \$dir/crl
database = \$dir/index.txt
new_certs_dir = \$dir/newcerts
certificate = \$dir/certs/intermediate.cert.pem
serial = \$dir/serial
crlnumber = \$dir/crlnumber
crl = \$dir/crl.pem
private_key = \$dir/private/intermediate.key.pem
RANDFILE = \$dir/private/.rand
x509_extensions = usr_cert
name_opt = ca_default
cert_opt = ca_default
default_days = 1825 # Durée de validité par défaut (5 ans)
default_crl_days = 30
default_md = sha256
preserve = no
policy = policy_loose # Politique plus souple pour les CA intermédiaires
[ policy_strict ]
countryName = match
stateOrProvinceName = match
organizationName = match
organizationName = match
organizationalUnitName = optional
commonName = supplied
emailAddress = optional
[ policy_loose ]
countryName = optional
stateOrProvinceName = optional
organizationName = optional
organizationalUnitName = optional
commonName = supplied
emailAddress = optional
[ usr_cert ]
# Extensions pour les certificats d'entité finale (signés par cette CA intermédiaire)
basicConstraints = CA:FALSE
subjectKeyIdentifier = hash
authorityKeyIdentifier = keyid,issuer
subjectAltName = @alt_names
extendedKeyUsage = clientAuth,serverAuth
# Ajout de l'URL OCSP
authorityInfoAccess = OCSP;URI:http://ocsp.cert-gestion.local/ # TODO: Remplacez par votre vrai nom de domaine OCSP
[ v3_intermediate_ca ]
# Extensions pour le certificat CA intermédiaire lui-même
subjectKeyIdentifier = hash
authorityKeyIdentifier = keyid:always,issuer
basicConstraints = critical, CA:true, pathlen:0 # pathlen:0 signifie qu'elle ne peut signer que des certificats finaux
keyUsage = critical, digitalSignature, cRLSign, keyCertSign
[ alt_names ]
# Exemple d'alt_names, à adapter si nécessaire
DNS.1 = *.${FUNCTIONAL_PERIMETER_NAME}.local
DNS.2 = ${FUNCTIONAL_PERIMETER_NAME}.local
EOF
# 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" 2048
else
openssl genrsa -out "$INTERMEDIATE_KEY" 2048
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=Hauts-de-France/L=Roubaix/O=GestionCertif/OU=$FUNCTIONAL_PERIMETER_NAME/CN=GestionCertif $FUNCTIONAL_PERIMETER_NAME Intermediate CA" \
-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 1825 -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"
echo "Certificat Intermédiaire CA pour '$FUNCTIONAL_PERIMETER_NAME' créé : $INTERMEDIATE_CERT"