mirror of
https://github.com/tips-of-mine/gestion-certificats2.git
synced 2025-06-28 06:58:43 +02:00
Add files via upload
This commit is contained in:
54
scripts/create_cert.sh
Normal file
54
scripts/create_cert.sh
Normal file
@ -0,0 +1,54 @@
|
||||
#!/bin/bash
|
||||
|
||||
# Ce script crée un certificat simple (d'entité finale) signé par le CA intermédiaire
|
||||
# du périmètre fonctionnel spécifié.
|
||||
# Il est appelé par l'application PHP.
|
||||
|
||||
# Arguments :
|
||||
# $1: Nom du sous-domaine (ex: www, api) ou nom commun
|
||||
# $2: Nom du périmètre fonctionnel (pour identifier le CA intermédiaire à utiliser)
|
||||
|
||||
SUBDOMAIN_OR_CN_NAME="$1"
|
||||
FUNCTIONAL_PERIMETER_NAME="$2"
|
||||
|
||||
if [ -z "$SUBDOMAIN_OR_CN_NAME" ] || [ -z "$FUNCTIONAL_PERIMETER_NAME" ]; then
|
||||
echo "Usage: $0 <subdomain_or_cn_name> <functional_perimeter_name>"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
INTERMEDIATE_CA_DIR="/opt/tls/intermediate/$FUNCTIONAL_PERIMETER_NAME"
|
||||
INTERMEDIATE_CNF="$INTERMEDIATE_CA_DIR/openssl.cnf"
|
||||
|
||||
# Vérifier si le CA intermédiaire existe
|
||||
if [ ! -f "$INTERMEDIATE_CA_DIR/certs/intermediate.cert.pem" ]; then
|
||||
echo "Erreur: Le certificat intermédiaire pour le périmètre '$FUNCTIONAL_PERIMETER_NAME' n'existe pas."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Nom de fichier pour le nouveau certificat et sa clé
|
||||
# Le nom du certificat sera au format: <subdomain_or_cn_name>.<functional_perimeter_name>.cert.pem
|
||||
CERT_BASE_NAME="${SUBDOMAIN_OR_CN_NAME}.${FUNCTIONAL_PERIMETER_NAME}"
|
||||
KEY_FILE="$INTERMEDIATE_CA_DIR/private/${CERT_BASE_NAME}.key.pem"
|
||||
CSR_FILE="$INTERMEDIATE_CA_DIR/csr/${CERT_BASE_NAME}.csr.pem"
|
||||
CERT_FILE="$INTERMEDIATE_CA_DIR/certs/${CERT_BASE_NAME}.cert.pem"
|
||||
|
||||
echo "Démarrage de la création du certificat '$SUBDOMAIN_OR_CN_NAME' pour le périmètre '$FUNCTIONAL_PERIMETER_NAME'..."
|
||||
|
||||
# Générer la clé privée pour le certificat (2048 bits, sans passphrase)
|
||||
openssl genrsa -out "$KEY_FILE" 2048
|
||||
chmod 400 "$KEY_FILE" # Permissions strictes
|
||||
|
||||
# Générer la CSR (Certificate Signing Request) pour le certificat
|
||||
# Le Common Name (CN) est important pour les certificats SSL/TLS
|
||||
openssl req -new -sha256 -key "$KEY_FILE" -out "$CSR_FILE" \
|
||||
-subj "/C=FR/ST=Hauts-de-France/L=Roubaix/O=GestionCertif/OU=${FUNCTIONAL_PERIMETER_NAME}/CN=${SUBDOMAIN_OR_CN_NAME}.cert-gestion.local" \
|
||||
-reqexts usr_cert -config "$INTERMEDIATE_CNF" # Utilise le CNF de l'intermédiaire et ses extensions usr_cert
|
||||
|
||||
# Signer la CSR avec le CA intermédiaire
|
||||
openssl ca -batch -config "$INTERMEDIATE_CNF" -extensions usr_cert -days 365 -notext -md sha256 \
|
||||
-in "$CSR_FILE" \
|
||||
-out "$CERT_FILE"
|
||||
|
||||
chmod 444 "$CERT_FILE" # Permissions en lecture seule
|
||||
|
||||
echo "Certificat '$CERT_BASE_NAME' créé avec succès : $CERT_FILE"
|
136
scripts/create_intermediate_cert.sh
Normal file
136
scripts/create_intermediate_cert.sh
Normal file
@ -0,0 +1,136 @@
|
||||
#!/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"
|
84
scripts/create_root_cert.sh
Normal file
84
scripts/create_root_cert.sh
Normal file
@ -0,0 +1,84 @@
|
||||
#!/bin/bash
|
||||
|
||||
# Ce script crée le certificat Root CA (Certificate Authority) auto-signé.
|
||||
# Il est destiné à être exécuté une seule fois, au premier lancement de l'application.
|
||||
|
||||
ROOT_CA_DIR="/opt/tls/root"
|
||||
ROOT_KEY="$ROOT_CA_DIR/private/ca.key.pem"
|
||||
ROOT_CERT="$ROOT_CA_DIR/certs/ca.cert.pem"
|
||||
ROOT_CNF="$ROOT_CA_DIR/openssl.cnf"
|
||||
|
||||
echo "Démarrage de la création du certificat Root CA dans $ROOT_CA_DIR..."
|
||||
|
||||
# Créer les dossiers nécessaires pour la PKI Root
|
||||
mkdir -p "$ROOT_CA_DIR/certs" "$ROOT_CA_DIR/crl" "$ROOT_CA_DIR/newcerts" "$ROOT_CA_DIR/private" "$ROOT_CA_DIR/csr"
|
||||
|
||||
chmod 777 "$ROOT_CA_DIR/certs" "$ROOT_CA_DIR/crl" "$ROOT_CA_DIR/newcerts" "$ROOT_CA_DIR/private" "$ROOT_CA_DIR/csr"
|
||||
|
||||
# Initialiser les fichiers requis par OpenSSL pour une CA
|
||||
touch "$ROOT_CA_DIR/index.txt"
|
||||
echo 1000 > "$ROOT_CA_DIR/serial" # Numéro de série initial pour les certificats
|
||||
echo 1000 > "$ROOT_CA_DIR/crlnumber" # Numéro de série initial pour la CRL
|
||||
|
||||
# Créer le fichier openssl.cnf pour le Root CA
|
||||
cat <<EOF > "$ROOT_CNF"
|
||||
[ ca ]
|
||||
default_ca = CA_default
|
||||
|
||||
[ CA_default ]
|
||||
dir = $ROOT_CA_DIR # Répertoire où tout est stocké
|
||||
certs = \$dir/certs # Répertoire des certificats émis
|
||||
crl_dir = \$dir/crl # Répertoire des CRL (Listes de révocation de certificats)
|
||||
database = \$dir/index.txt # Fichier d'index de la base de données (pour OpenSSL)
|
||||
new_certs_dir = \$dir/newcerts # Emplacement par défaut pour les nouveaux certificats
|
||||
|
||||
certificate = \$dir/certs/ca.cert.pem # Le certificat CA lui-même
|
||||
serial = \$dir/serial # Le numéro de série actuel
|
||||
crlnumber = \$dir/crlnumber # Le numéro de CRL actuel
|
||||
crl = \$dir/crl.pem # Le fichier CRL lui-même
|
||||
private_key = \$dir/private/ca.key.pem # La clé privée du CA
|
||||
RANDFILE = \$dir/private/.rand # Fichier de nombres aléatoires privé
|
||||
|
||||
x509_extensions = v3_ca # Extensions X509 à ajouter au certificat
|
||||
name_opt = ca_default # Options de nom de sujet
|
||||
cert_opt = ca_default # Options de certificat
|
||||
default_days = 3650 # Durée de validité par défaut des certificats (10 ans)
|
||||
default_crl_days = 30 # Durée avant la prochaine mise à jour CRL
|
||||
default_md = sha256 # Utiliser SHA-256 par défaut
|
||||
preserve = no # Conserver l'ordre des DN passé
|
||||
|
||||
policy = policy_strict # Politique stricte pour le Root CA
|
||||
|
||||
[ policy_strict ]
|
||||
countryName = match
|
||||
stateOrProvinceName = match
|
||||
organizationName = match
|
||||
organizationalUnitName = optional
|
||||
commonName = supplied
|
||||
emailAddress = optional
|
||||
|
||||
[ v3_ca ]
|
||||
# Extensions pour le certificat CA Root
|
||||
subjectKeyIdentifier = hash
|
||||
authorityKeyIdentifier = keyid:always,issuer
|
||||
basicConstraints = critical, CA:true # C'est une CA, peut signer d'autres certificats
|
||||
keyUsage = critical, digitalSignature, cRLSign, keyCertSign
|
||||
|
||||
# Ajout de l'URL OCSP au certificat Root CA
|
||||
# IMPORTANT: Remplacez ocsp.cert-gestion.local par votre vrai nom de domaine OCSP
|
||||
authorityInfoAccess = OCSP;URI:http://ocsp.cert-gestion.local/
|
||||
|
||||
EOF
|
||||
|
||||
# Générer la clé privée du Root CA (2048 bits, sans passphrase pour la simplicité)
|
||||
openssl genrsa -out "$ROOT_KEY" 2048
|
||||
chmod 400 "$ROOT_KEY" # Permissions strictes pour la clé privée
|
||||
|
||||
# Générer le certificat Root CA auto-signé
|
||||
openssl req -x509 -new -nodes -key "$ROOT_KEY" -sha256 -days 3650 -out "$ROOT_CERT" \
|
||||
-subj "/C=FR/ST=Hauts-de-France/L=Roubaix/O=GestionCertif/CN=GestionCertif Root CA" \
|
||||
-config "$ROOT_CNF" -extensions v3_ca
|
||||
|
||||
chmod 444 "$ROOT_CERT" # Permissions en lecture seule pour le certificat
|
||||
|
||||
echo "Certificat Root CA créé avec succès : $ROOT_CERT"
|
25
scripts/ocsp_responder.sh
Normal file
25
scripts/ocsp_responder.sh
Normal file
@ -0,0 +1,25 @@
|
||||
#!/bin/bash
|
||||
|
||||
# Ce script est un exemple très rudimentaire de ce que ferait un répondeur OCSP.
|
||||
# En production, un répondeur OCSP serait un service séparé et persistant.
|
||||
# Ce script ne gère PAS les requêtes OCSP entrantes, il montre juste la commande
|
||||
# pour générer une réponse OCSP si on lui donne une requête.
|
||||
|
||||
# Arguments attendus si le script était appelé par l'application PHP
|
||||
# $1: Chemin vers le certificat à vérifier (certificat de l'utilisateur final)
|
||||
# $2: Chemin vers le certificat du CA émetteur (intermédiaire ou root)
|
||||
# $3: Chemin vers la clé privée du CA émetteur
|
||||
# $4: Chemin vers la CRL du CA émetteur
|
||||
|
||||
# Exemple d'utilisation (ce n'est pas ce que Nginx/PHP ferait directement pour chaque requête OCSP) :
|
||||
# openssl ocsp -index <CA_index_file> -CA <CA_cert> -rsigner <OCSP_signer_cert> -rkey <OCSP_signer_key> \
|
||||
# -issuer <issuer_cert> -cert <certificate_to_check> -url <OCSP_url>
|
||||
|
||||
echo "Ce script est un exemple et ne fonctionne pas comme un répondeur OCSP autonome pour HTTP."
|
||||
echo "Un répondeur OCSP réel devrait écouter les requêtes et y répondre de manière persistante."
|
||||
echo "Pour simuler une réponse OCSP avec OpenSSL, vous devrez lancer un serveur OCSP comme ceci (en arrière-plan):"
|
||||
echo "openssl ocsp -index /root/tls/intermediate/mon_perimetre/index.txt -CA /root/tls/intermediate/mon_perimetre/certs/intermediate.cert.pem -rsigner /root/tls/intermediate/mon_perimetre/certs/intermediate.cert.pem -rkey /root/tls/intermediate/mon_perimetre/private/intermediate.key.pem -port 8888"
|
||||
echo "Puis configurer Nginx pour proxyfier les requêtes à ce port."
|
||||
|
||||
# Pour la démo, si ce script était appelé, il ne ferait rien de fonctionnel en tant que répondeur HTTP.
|
||||
exit 0
|
55
scripts/revoke_cert.sh
Normal file
55
scripts/revoke_cert.sh
Normal file
@ -0,0 +1,55 @@
|
||||
#!/bin/bash
|
||||
|
||||
# Ce script révoque un certificat simple émis par un CA intermédiaire.
|
||||
# Il met également à jour la CRL (Certificate Revocation List) du CA émetteur.
|
||||
# Il est appelé par l'application PHP.
|
||||
|
||||
# Arguments :
|
||||
# $1: Nom du certificat à révoquer (ex: www.finance.cert)
|
||||
# $2: Nom du périmètre fonctionnel (pour trouver le CA intermédiaire qui l'a émis)
|
||||
|
||||
CERT_BASE_NAME="$1" # Ex: www.finance.cert (sans l'extension .pem)
|
||||
FUNCTIONAL_PERIMETER_NAME="$2"
|
||||
|
||||
if [ -z "$CERT_BASE_NAME" ] || [ -z "$FUNCTIONAL_PERIMETER_NAME" ]; then
|
||||
echo "Usage: $0 <cert_base_name> <functional_perimeter_name>"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
INTERMEDIATE_CA_DIR="/opt/tls/intermediate/$FUNCTIONAL_PERIMETER_NAME"
|
||||
INTERMEDIATE_CNF="$INTERMEDIATE_CA_DIR/openssl.cnf"
|
||||
CERT_PATH="$INTERMEDIATE_CA_DIR/certs/${CERT_BASE_NAME}.cert.pem"
|
||||
CRL_PATH="$INTERMEDIATE_CA_DIR/crl/crl.pem"
|
||||
|
||||
echo "Démarrage de la révocation du certificat '$CERT_BASE_NAME' pour le périmètre '$FUNCTIONAL_PERIMETER_NAME'..."
|
||||
|
||||
# Vérifier si le certificat existe physiquement et si le CA intermédiaire est prêt
|
||||
if [ ! -f "$CERT_PATH" ]; then
|
||||
echo "Erreur: Le certificat '$CERT_PATH' n'existe pas."
|
||||
exit 1
|
||||
fi
|
||||
if [ ! -f "$INTERMEDIATE_CNF" ]; then
|
||||
echo "Erreur: Le fichier de configuration OpenSSL pour le CA intermédiaire '$FUNCTIONAL_PERIMETER_NAME' n'existe pas."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Révoquer le certificat
|
||||
# Utilise -batch pour éviter les invites interactives
|
||||
openssl ca -batch -config "$INTERMEDIATE_CNF" -revoke "$CERT_PATH"
|
||||
|
||||
# Vérifier le succès de la révocation via le code de sortie
|
||||
if [ $? -ne 0 ]; then
|
||||
echo "Erreur: La révocation du certificat '$CERT_BASE_NAME' a échoué."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo "Certificat '$CERT_BASE_NAME' révoqué avec succès."
|
||||
|
||||
# Mettre à jour la CRL (liste de révocation de certificats)
|
||||
openssl ca -batch -config "$INTERMEDIATE_CNF" -gencrl -out "$CRL_PATH"
|
||||
|
||||
if [ $? -ne 0 ]; then
|
||||
echo "Avertissement: La génération de la CRL a échoué. Veuillez vérifier manuellement."
|
||||
else
|
||||
echo "CRL mise à jour et disponible à : $CRL_PATH"
|
||||
fi
|
Reference in New Issue
Block a user