Merge pull request #17 from tips-of-mine/fix/multiple-errors-after-perimeter

This commit addresses several issues:
This commit is contained in:
tips-of-mine
2025-06-16 13:38:07 +02:00
committed by GitHub
4 changed files with 22 additions and 4 deletions

View File

@ -142,8 +142,8 @@ if ($userCount === 0 || !$rootCertExists) {
$expirationDate = $expirationTimestamp ? date('Y-m-d H:i:s', $expirationTimestamp) : (new DateTime('+10 years'))->format('Y-m-d H:i:s'); $expirationDate = $expirationTimestamp ? date('Y-m-d H:i:s', $expirationTimestamp) : (new DateTime('+10 years'))->format('Y-m-d H:i:s');
// Enregistrer le certificat root dans la base de données // Enregistrer le certificat root dans la base de données
$stmt = $dbInstance->prepare("INSERT INTO certificates (name, type, common_name, expiration_date) VALUES (?, ?, ?, ?)"); $stmt = $dbInstance->prepare("INSERT INTO certificates (name, type, expiration_date) VALUES (?, ?, ?)");
$stmt->execute(['ca.cert.pem', 'root', $_SESSION['init_root_domain'], $expirationDate]); $stmt->execute(['ca.cert.pem', 'root', $expirationDate]);
} else { } else {
echo "<p style=\"color: red;\">Erreur lors de la création du certificat Root CA. Veuillez vérifier les logs PHP et Docker.</p>"; echo "<p style=\"color: red;\">Erreur lors de la création du certificat Root CA. Veuillez vérifier les logs PHP et Docker.</p>";
echo "<pre>" . htmlspecialchars($output) . "</pre>"; echo "<pre>" . htmlspecialchars($output) . "</pre>";

View File

@ -51,6 +51,7 @@ class PerimeterController
$errorMessage = $_SESSION['error'] ?? null; $errorMessage = $_SESSION['error'] ?? null;
unset($_SESSION['error']); unset($_SESSION['error']);
$userRole = $this->authService->getUserRole(); // Définir $userRole
require_once APP_ROOT_DIR . '/src/Views/perimeters/index.php'; require_once APP_ROOT_DIR . '/src/Views/perimeters/index.php';
} }
@ -163,11 +164,12 @@ class PerimeterController
if (strpos($output, "Certificat Intermédiaire CA pour '$perimeterName' créé") !== false) { if (strpos($output, "Certificat Intermédiaire CA pour '$perimeterName' créé") !== false) {
// Enregistrer le périmètre dans la base de données // Enregistrer le périmètre dans la base de données
$stmt = $this->db->prepare("INSERT INTO functional_perimeters (name, intermediate_cert_name) VALUES (?, ?)"); $stmt = $this->db->prepare("INSERT INTO functional_perimeters (name, intermediate_cert_name) VALUES (?, ?)");
$intermediateCertFileName = "intermediate.cert.pem"; // Nom générique du fichier pour l'intermédiaire $intermediateCertFileName = $perimeterName . "_intermediate.cert.pem"; // Nom unique pour la BDD
$stmt->execute([$perimeterName, $intermediateCertFileName]); $stmt->execute([$perimeterName, $intermediateCertFileName]);
$perimeterId = $this->db->lastInsertId(); $perimeterId = $this->db->lastInsertId();
// Enregistrer le certificat intermédiaire dans la table des certificats // Enregistrer le certificat intermédiaire dans la table des certificats
// Le nom de fichier sur le disque reste "intermediate.cert.pem" dans son dossier de périmètre.
$fullCertPath = INTERMEDIATE_CA_PATH_BASE . "/{$perimeterName}/certs/intermediate.cert.pem"; $fullCertPath = INTERMEDIATE_CA_PATH_BASE . "/{$perimeterName}/certs/intermediate.cert.pem";
$expirationDate = (new \DateTime('+5 years'))->format('Y-m-d H:i:s'); // Valeur par défaut $expirationDate = (new \DateTime('+5 years'))->format('Y-m-d H:i:s'); // Valeur par défaut
if (file_exists($fullCertPath)) { if (file_exists($fullCertPath)) {
@ -178,14 +180,21 @@ class PerimeterController
} }
} }
// Utiliser $intermediateCertFileName (qui est maintenant unique) pour l'enregistrement en BDD dans la table 'certificates'
$stmt = $this->db->prepare("INSERT INTO certificates (name, type, functional_perimeter_id, expiration_date) VALUES (?, ?, ?, ?)"); $stmt = $this->db->prepare("INSERT INTO certificates (name, type, functional_perimeter_id, expiration_date) VALUES (?, ?, ?, ?)");
$stmt->execute([$intermediateCertFileName, 'intermediate', $perimeterId, $expirationDate]); $stmt->execute([$intermediateCertFileName, 'intermediate', $perimeterId, $expirationDate]);
$this->logService->log('info', "Périmètre fonctionnel '$perimeterName' créé avec succès et certificat intermédiaire généré.", $userId, $ipAddress); $this->logService->log('info', "Périmètre fonctionnel '$perimeterName' créé avec succès et certificat intermédiaire généré.", $userId, $ipAddress);
$_SESSION['success'] = $this->langService->__('perimeter_create_success'); $_SESSION['success'] = $this->langService->__('perimeter_create_success');
} else {
// Check for specific error message
$specificErrorMessage = "Erreur : Le répertoire pour le périmètre '$perimeterName' existe déjà.";
if (strpos($output, $specificErrorMessage) !== false) {
$_SESSION['error'] = $this->langService->__('perimeter_create_error_directory_exists', ['perimeterName' => $perimeterName]);
} else { } else {
$_SESSION['error'] = $this->langService->__('perimeter_create_error', ['output' => htmlspecialchars($output)]); $_SESSION['error'] = $this->langService->__('perimeter_create_error', ['output' => htmlspecialchars($output)]);
}
$this->logService->log('error', "Échec création périmètre '$perimeterName': $output", $userId, $ipAddress); $this->logService->log('error', "Échec création périmètre '$perimeterName': $output", $userId, $ipAddress);
} }

View File

@ -25,6 +25,13 @@ fi
ROOT_CA_DIR="/opt/tls/root" ROOT_CA_DIR="/opt/tls/root"
INTERMEDIATE_CA_DIR="/opt/tls/intermediate/$FUNCTIONAL_PERIMETER_NAME" INTERMEDIATE_CA_DIR="/opt/tls/intermediate/$FUNCTIONAL_PERIMETER_NAME"
# Vérifier si le répertoire de la CA intermédiaire existe déjà
if [ -d "$INTERMEDIATE_CA_DIR" ]; then
echo "Erreur : Le répertoire pour le périmètre '$FUNCTIONAL_PERIMETER_NAME' existe déjà. Veuillez le supprimer ou choisir un autre nom."
exit 1
fi
INTERMEDIATE_KEY="$INTERMEDIATE_CA_DIR/private/intermediate.key.pem" INTERMEDIATE_KEY="$INTERMEDIATE_CA_DIR/private/intermediate.key.pem"
INTERMEDIATE_CSR="$INTERMEDIATE_CA_DIR/csr/intermediate.csr.pem" INTERMEDIATE_CSR="$INTERMEDIATE_CA_DIR/csr/intermediate.csr.pem"
INTERMEDIATE_CERT="$INTERMEDIATE_CA_DIR/certs/intermediate.cert.pem" INTERMEDIATE_CERT="$INTERMEDIATE_CA_DIR/certs/intermediate.cert.pem"

View File

@ -31,8 +31,10 @@ cp /opt/scripts/configs/root-openssl.conf "$ROOT_CNF"
# Initialiser les fichiers requis par OpenSSL pour une CA # Initialiser les fichiers requis par OpenSSL pour une CA
touch "$ROOT_CA_DIR/index.txt" touch "$ROOT_CA_DIR/index.txt"
chmod 666 "$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/serial" # Numéro de série initial pour les certificats
chmod 666 "$ROOT_CA_DIR/serial"
echo 1000 > "$ROOT_CA_DIR/crlnumber" # Numéro de série initial pour la CRL echo 1000 > "$ROOT_CA_DIR/crlnumber" # Numéro de série initial pour la CRL
# Générer la clé privée du Root CA (2048 bits, sans passphrase pour la simplicité) # Générer la clé privée du Root CA (2048 bits, sans passphrase pour la simplicité)