diff --git a/app/src/Controllers/CertificateController.php b/app/src/Controllers/CertificateController.php index bd1d6d6..0494056 100644 --- a/app/src/Controllers/CertificateController.php +++ b/app/src/Controllers/CertificateController.php @@ -133,9 +133,38 @@ class CertificateController } $functionalPerimeterName = $perimeter['name']; - // Préparer la commande du script shell - // Important: utiliser escapeshellarg pour protéger les arguments - $command = escapeshellcmd(SCRIPTS_PATH . '/create_cert.sh') . ' ' . + // Extraire ROOT_DOMAIN du certificat CA racine pour SAN et OCSP + $rootCaCertPath = ROOT_CA_PATH . '/certs/ca.cert.pem'; + if (!file_exists($rootCaCertPath)) { + $this->logService->log('error', "Certificat CA racine non trouvé pour extraction ROOT_DOMAIN lors de la création de cert feuille.", $userId, $ipAddress); + $_SESSION['error'] = $this->langService->__('cert_create_error_root_cert_missing'); // Needs this translation key + header('Location: /certificates/create'); + exit(); + } + $subjectCommand = "openssl x509 -noout -subject -in " . escapeshellarg($rootCaCertPath); + $subjectLine = shell_exec($subjectCommand); + $rootDomain = null; + if ($subjectLine && preg_match('/CN\s*=\s*ca\.([^\/,\s]+)/', $subjectLine, $matches)) { + $rootDomain = $matches[1]; + } + if (empty($rootDomain)) { + $this->logService->log('error', "Impossible d'extraire ROOT_DOMAIN du cert CA racine (pour SAN). Regex: '/CN\s*=\s*ca\.([^\/,\s]+)/' Sujet: " . ($subjectLine ?: 'vide'), $userId, $ipAddress); + $_SESSION['error'] = $this->langService->__('cert_create_error_root_domain_extraction'); // Needs this translation key + header('Location: /certificates/create'); + exit(); + } + $this->logService->log('info', "ROOT_DOMAIN extrait pour SAN/OCSP: $rootDomain", $userId, $ipAddress); + + // Construire la valeur SAN + $sanValue = "DNS:" . $subdomainName . "." . $functionalPerimeterName . "." . $rootDomain; + + // Récupérer OCSP_URL + $ocspUrl = OCSP_URL; // Constante de app/src/config/app.php + + // Préparer la commande du script shell avec les variables d'environnement + $scriptPath = SCRIPTS_PATH . '/create_cert.sh'; + $command = "OCSP_URL=" . escapeshellarg($ocspUrl) . " SAN=" . escapeshellarg($sanValue) . " " . + escapeshellcmd($scriptPath) . ' ' . escapeshellarg($subdomainName) . ' ' . escapeshellarg($functionalPerimeterName); @@ -144,8 +173,11 @@ class CertificateController // Exécuter le script shell $output = shell_exec($command . ' 2>&1'); // Redirige stderr vers stdout - // Vérifier le résultat du script (simple vérification de chaîne, une meilleure parsage serait utile) - if (strpos($output, "Certificat '${subdomainName}.${functionalPerimeterName}.cert' créé avec succès") !== false) { + // Vérifier le résultat du script + // Le script create_cert.sh sort "Certificat '$CERT_BASE_NAME' créé avec succès : $CERT_FILE" + // où $CERT_BASE_NAME est "${SUBDOMAIN_OR_CN_NAME}.${FUNCTIONAL_PERIMETER_NAME}" + $certBaseNameForCheck = $subdomainName . '.' . $functionalPerimeterName; + if (strpos($output, "Certificat '" . $certBaseNameForCheck . "' créé avec succès :") !== false) { // Extraire la date d'expiration du certificat créé (en lisant le fichier cert ou en estimant 1 an) $certFileName = "{$subdomainName}.{$functionalPerimeterName}.cert.pem"; $fullCertPath = INTERMEDIATE_CA_PATH_BASE . "/{$functionalPerimeterName}/certs/{$certFileName}"; diff --git a/scripts/create_cert.sh b/scripts/create_cert.sh index 0abdbc4..1263b56 100644 --- a/scripts/create_cert.sh +++ b/scripts/create_cert.sh @@ -42,10 +42,10 @@ chmod 400 "$KEY_FILE" # Permissions strictes # 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 + -reqexts v3_leaf -config "$INTERMEDIATE_CNF" # Utilise le CNF de l'intermédiaire et ses extensions v3_leaf # Signer la CSR avec le CA intermédiaire -openssl ca -batch -config "$INTERMEDIATE_CNF" -extensions usr_cert -days 365 -notext -md sha256 \ +openssl ca -batch -config "$INTERMEDIATE_CNF" -extensions v3_leaf -days 365 -notext -md sha256 \ -in "$CSR_FILE" \ -out "$CERT_FILE"