diff --git a/app/public/index.php b/app/public/index.php index ed558e5..862c489 100644 --- a/app/public/index.php +++ b/app/public/index.php @@ -76,33 +76,60 @@ $userCount = $stmt->fetchColumn(); $rootCertExists = file_exists(ROOT_CA_PATH . '/certs/ca.cert.pem'); if ($userCount === 0 || !$rootCertExists) { - // Afficher une page d'initialisation ou un message d'attente - echo "Initialisation"; + // Début de la logique de formulaire et de session pour l'initialisation + if (!isset($_SESSION['init_admin_password'], $_SESSION['init_root_domain'])) { + if (isset($_POST['admin_password'], $_POST['root_domain']) && !empty($_POST['admin_password']) && !empty($_POST['root_domain'])) { + $_SESSION['init_admin_password'] = $_POST['admin_password']; + $_SESSION['init_root_domain'] = $_POST['root_domain']; + header('Location: ' . $_SERVER['PHP_SELF']); + exit(); + } else { + // Afficher le formulaire d'initialisation + echo "Initialisation Requise"; + echo "
"; + echo "

Initialisation de l'Application Requise

"; + echo "

Veuillez fournir les informations suivantes pour la configuration initiale :

"; + echo "
"; + echo "
"; + echo "
Exemple: exemple.com
"; + echo ""; + echo "
"; + echo "
"; + exit(); + } + } + + // Si nous arrivons ici, les données de session sont définies. Procéder à l'initialisation. + echo "Initialisation en cours"; echo "

Initialisation de l'Application

"; - echo "

Ceci est le premier lancement. Nous allons configurer la base de données, créer le certificat Root CA et le premier compte administrateur.

"; + echo "

Configuration en cours avec les informations fournies...

"; // Création du certificat Root CA si non existant if (!$rootCertExists) { echo "

Création du certificat Root CA en cours...

"; - $logService->log('info', 'Lancement de la création du certificat Root CA.', null, $_SERVER['REMOTE_ADDR']); - // Exécution du script shell de création de certificat root - $command = escapeshellcmd(SCRIPTS_PATH . '/create_root_cert.sh'); // Utilise la constante + $logService->log('info', 'Lancement de la création du certificat Root CA pour le domaine: ' . $_SESSION['init_root_domain'], null, $_SERVER['REMOTE_ADDR']); + // Exécution du script shell de création de certificat root avec le domaine racine + $command = escapeshellcmd(SCRIPTS_PATH . '/create_root_cert.sh ' . escapeshellarg($_SESSION['init_root_domain'])); $output = shell_exec($command . ' 2>&1'); $logService->log('info', "Résultat création Root CA: " . $output, null, $_SERVER['REMOTE_ADDR']); if (file_exists(ROOT_CA_PATH . '/certs/ca.cert.pem')) { - echo "

Certificat Root CA créé avec succès.

"; + echo "

Certificat Root CA créé avec succès pour le domaine " . htmlspecialchars($_SESSION['init_root_domain']) . ".

"; // Extraire la date d'expiration du certificat créé pour l'enregistrer en BDD $certInfo = shell_exec("openssl x509 -in " . escapeshellarg(ROOT_CA_PATH . '/certs/ca.cert.pem') . " -noout -enddate 2>/dev/null | cut -d= -f2"); $expirationTimestamp = strtotime($certInfo); $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 - $stmt = $dbInstance->prepare("INSERT INTO certificates (name, type, expiration_date) VALUES (?, ?, ?)"); - $stmt->execute(['ca.cert.pem', 'root', $expirationDate]); + $stmt = $dbInstance->prepare("INSERT INTO certificates (name, type, common_name, expiration_date) VALUES (?, ?, ?, ?)"); + $stmt->execute(['ca.cert.pem', 'root', $_SESSION['init_root_domain'], $expirationDate]); } else { echo "

Erreur lors de la création du certificat Root CA. Veuillez vérifier les logs PHP et Docker.

"; echo "
" . htmlspecialchars($output) . "
"; + // Nettoyer les variables de session en cas d'erreur pour permettre une nouvelle tentative + unset($_SESSION['init_admin_password']); + unset($_SESSION['init_root_domain']); + echo "

Réessayer

"; // Arrête l'exécution pour que l'utilisateur puisse voir l'erreur exit(); } @@ -112,15 +139,21 @@ if ($userCount === 0 || !$rootCertExists) { if ($userCount === 0) { echo "

Création du premier compte administrateur...

"; $adminUsername = 'admin'; - $adminPasswordPlain = 'adminpass'; // Mot de passe par défaut très faible, À CHANGER IMMÉDIATEMENT EN PRODUCTION ! + // Utiliser le mot de passe fourni via le formulaire et stocké en session + $adminPasswordPlain = $_SESSION['init_admin_password']; $adminPasswordHashed = password_hash($adminPasswordPlain, PASSWORD_DEFAULT); $stmt = $dbInstance->prepare("INSERT INTO users (username, password, role) VALUES (?, ?, ?)"); $stmt->execute([$adminUsername, $adminPasswordHashed, 'admin']); - $logService->log('info', "Compte administrateur '$adminUsername' créé.", $stmt->lastInsertId(), $_SERVER['REMOTE_ADDR']); - echo "

Compte administrateur 'admin' créé avec succès. Mot de passe initial: {$adminPasswordPlain} (veuillez le changer après la première connexion !)

"; + $userId = $dbInstance->lastInsertId(); // Récupérer l'ID de l'utilisateur créé + $logService->log('info', "Compte administrateur '$adminUsername' créé.", $userId, $_SERVER['REMOTE_ADDR']); + echo "

Compte administrateur 'admin' créé avec succès. Le mot de passe a été défini comme vous l'avez fourni. Veuillez le conserver précieusement.

"; } + // Nettoyer les variables de session d'initialisation après une initialisation réussie + unset($_SESSION['init_admin_password']); + unset($_SESSION['init_root_domain']); + echo "

Initialisation terminée. Redirection vers la page de connexion dans 5 secondes...

"; echo "
"; // Redirection automatique après l'initialisation diff --git a/scripts/create_root_cert.sh b/scripts/create_root_cert.sh index 1879a22..cd06991 100644 --- a/scripts/create_root_cert.sh +++ b/scripts/create_root_cert.sh @@ -3,6 +3,16 @@ # 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. +# Récupérer le domaine racine depuis le premier argument +ROOT_DOMAIN=$1 + +# Vérifier si ROOT_DOMAIN est fourni +if [ -z "$ROOT_DOMAIN" ]; then + echo "Erreur: Le domaine racine (ROOT_DOMAIN) doit être fourni en argument." + echo "Usage: $0 " + exit 1 +fi + ROOT_CA_DIR="/opt/tls/root" ROOT_KEY="$ROOT_CA_DIR/private/ca.key.pem" ROOT_CERT="$ROOT_CA_DIR/certs/ca.cert.pem" @@ -29,7 +39,7 @@ 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=NORD/L=ROUBAIX/O=IT/OU=IT/emailAddress=sec@tips-mine.com/CN=intermediate-cert.$ROOT_DOMAIN/" \ + -subj "/C=FR/ST=NORD/L=ROUBAIX/O=IT/OU=IT/emailAddress=sec@tips-mine.com/CN=ca.$ROOT_DOMAIN/" \ -config "$ROOT_CNF" -extensions v3_ca chmod 444 "$ROOT_CERT" # Permissions en lecture seule pour le certificat