mirror of
https://github.com/tips-of-mine/gestion-certificats2.git
synced 2025-06-28 06:58:43 +02:00
Merge pull request #8 from tips-of-mine/feat/init-ask-creds-domain
Feat/init ask creds domain
This commit is contained in:
@ -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 "<!DOCTYPE html><html lang=\"fr\"><head><meta charset=\"UTF-8\"><title>Initialisation</title><link rel=\"stylesheet\" href=\"/css/style.css\"></head><body>";
|
||||
// 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 "<!DOCTYPE html><html lang=\"fr\"><head><meta charset=\"UTF-8\"><title>Initialisation Requise</title><link rel=\"stylesheet\" href=\"/css/style.css\"></head><body>";
|
||||
echo "<div class=\"container\">";
|
||||
echo "<h1>Initialisation de l'Application Requise</h1>";
|
||||
echo "<p>Veuillez fournir les informations suivantes pour la configuration initiale :</p>";
|
||||
echo "<form method=\"POST\" action=\"" . htmlspecialchars($_SERVER['PHP_SELF']) . "\">";
|
||||
echo "<div><label for=\"admin_password\">Mot de passe administrateur initial :</label><input type=\"password\" id=\"admin_password\" name=\"admin_password\" required></div>";
|
||||
echo "<div><label for=\"root_domain\">Domaine racine (ROOT_DOMAIN) pour le certificat CA :</label><input type=\"text\" id=\"root_domain\" name=\"root_domain\" required><small>Exemple: exemple.com</small></div>";
|
||||
echo "<button type=\"submit\">Configurer</button>";
|
||||
echo "</form>";
|
||||
echo "</div></body></html>";
|
||||
exit();
|
||||
}
|
||||
}
|
||||
|
||||
// Si nous arrivons ici, les données de session sont définies. Procéder à l'initialisation.
|
||||
echo "<!DOCTYPE html><html lang=\"fr\"><head><meta charset=\"UTF-8\"><title>Initialisation en cours</title><link rel=\"stylesheet\" href=\"/css/style.css\"></head><body>";
|
||||
echo "<div class=\"container\"><h1>Initialisation de l'Application</h1>";
|
||||
echo "<p>Ceci est le premier lancement. Nous allons configurer la base de données, créer le certificat Root CA et le premier compte administrateur.</p>";
|
||||
echo "<p>Configuration en cours avec les informations fournies...</p>";
|
||||
|
||||
// Création du certificat Root CA si non existant
|
||||
if (!$rootCertExists) {
|
||||
echo "<p>Création du certificat Root CA en cours...</p>";
|
||||
$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 "<p>Certificat Root CA créé avec succès.</p>";
|
||||
echo "<p>Certificat Root CA créé avec succès pour le domaine " . htmlspecialchars($_SESSION['init_root_domain']) . ".</p>";
|
||||
// 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 "<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>";
|
||||
// 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 "<p><a href=\"" . htmlspecialchars($_SERVER['PHP_SELF']) . "\">Réessayer</a></p>";
|
||||
// Arrête l'exécution pour que l'utilisateur puisse voir l'erreur
|
||||
exit();
|
||||
}
|
||||
@ -112,19 +139,29 @@ if ($userCount === 0 || !$rootCertExists) {
|
||||
if ($userCount === 0) {
|
||||
echo "<p>Création du premier compte administrateur...</p>";
|
||||
$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 "<p>Compte administrateur 'admin' créé avec succès. Mot de passe initial: <b>{$adminPasswordPlain}</b> (veuillez le changer après la première connexion !)</p>";
|
||||
$userId = $dbInstance->lastInsertId(); // Récupérer l'ID de l'utilisateur créé
|
||||
$logService->log('info', "Compte administrateur '$adminUsername' créé.", $userId, $_SERVER['REMOTE_ADDR']);
|
||||
echo "<p>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.</p>";
|
||||
}
|
||||
|
||||
// Nettoyer les variables de session d'initialisation après une initialisation réussie
|
||||
unset($_SESSION['init_admin_password']);
|
||||
unset($_SESSION['init_root_domain']);
|
||||
|
||||
// Fermer la session pour s'assurer que les unsets sont sauvegardés avant toute sortie ou redirection.
|
||||
session_write_close();
|
||||
|
||||
echo "<p>Initialisation terminée. Redirection vers la page de connexion dans 5 secondes...</p>";
|
||||
// Redirection JavaScript après 5 secondes
|
||||
echo "<script type='text/javascript'>setTimeout(function() { window.location.href = '/login'; }, 5000);</script>";
|
||||
echo "</div></body></html>";
|
||||
// Redirection automatique après l'initialisation
|
||||
header('Refresh: 5; URL=/login');
|
||||
// header('Refresh: 5; URL=/login'); // Ancienne méthode de redirection commentée
|
||||
exit();
|
||||
}
|
||||
// ----------------------------------------------------
|
||||
|
@ -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 <votredomaine.com>"
|
||||
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
|
||||
|
Reference in New Issue
Block a user