#!/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 " 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"