mirror of
https://github.com/tips-of-mine/gestion-certificats2.git
synced 2025-06-28 13:58:42 +02:00
feat: Demande du mot de passe admin et du ROOT_DOMAIN à l'initialisation
Modifie le processus d'initialisation de l'application : - Lors du premier lancement, un formulaire vous demande maintenant de saisir le mot de passe souhaité pour le compte administrateur initial et le ROOT_DOMAIN à utiliser pour le certificat CA. - Ces informations sont temporairement stockées en session. - Le script `create_root_cert.sh` a été modifié pour accepter le ROOT_DOMAIN en argument et l'utilise pour générer le CN du certificat racine. - Le mot de passe fourni est utilisé pour créer le premier utilisateur administrateur. - Les variables de session contenant ces informations sont nettoyées après la fin du processus d'initialisation. Cela améliore la sécurité en évitant un mot de passe par défaut codé en dur et permet une configuration flexible du domaine du certificat racine dès le départ.
This commit is contained in:
@ -76,33 +76,60 @@ $userCount = $stmt->fetchColumn();
|
|||||||
$rootCertExists = file_exists(ROOT_CA_PATH . '/certs/ca.cert.pem');
|
$rootCertExists = file_exists(ROOT_CA_PATH . '/certs/ca.cert.pem');
|
||||||
|
|
||||||
if ($userCount === 0 || !$rootCertExists) {
|
if ($userCount === 0 || !$rootCertExists) {
|
||||||
// Afficher une page d'initialisation ou un message d'attente
|
// Début de la logique de formulaire et de session pour l'initialisation
|
||||||
echo "<!DOCTYPE html><html lang=\"fr\"><head><meta charset=\"UTF-8\"><title>Initialisation</title><link rel=\"stylesheet\" href=\"/css/style.css\"></head><body>";
|
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 "<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
|
// Création du certificat Root CA si non existant
|
||||||
if (!$rootCertExists) {
|
if (!$rootCertExists) {
|
||||||
echo "<p>Création du certificat Root CA en cours...</p>";
|
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']);
|
$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
|
// Exécution du script shell de création de certificat root avec le domaine racine
|
||||||
$command = escapeshellcmd(SCRIPTS_PATH . '/create_root_cert.sh'); // Utilise la constante
|
$command = escapeshellcmd(SCRIPTS_PATH . '/create_root_cert.sh ' . escapeshellarg($_SESSION['init_root_domain']));
|
||||||
$output = shell_exec($command . ' 2>&1');
|
$output = shell_exec($command . ' 2>&1');
|
||||||
$logService->log('info', "Résultat création Root CA: " . $output, null, $_SERVER['REMOTE_ADDR']);
|
$logService->log('info', "Résultat création Root CA: " . $output, null, $_SERVER['REMOTE_ADDR']);
|
||||||
|
|
||||||
if (file_exists(ROOT_CA_PATH . '/certs/ca.cert.pem')) {
|
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
|
// 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");
|
$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);
|
$expirationTimestamp = strtotime($certInfo);
|
||||||
$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, expiration_date) VALUES (?, ?, ?)");
|
$stmt = $dbInstance->prepare("INSERT INTO certificates (name, type, common_name, expiration_date) VALUES (?, ?, ?, ?)");
|
||||||
$stmt->execute(['ca.cert.pem', 'root', $expirationDate]);
|
$stmt->execute(['ca.cert.pem', 'root', $_SESSION['init_root_domain'], $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>";
|
||||||
|
// 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
|
// Arrête l'exécution pour que l'utilisateur puisse voir l'erreur
|
||||||
exit();
|
exit();
|
||||||
}
|
}
|
||||||
@ -112,15 +139,21 @@ if ($userCount === 0 || !$rootCertExists) {
|
|||||||
if ($userCount === 0) {
|
if ($userCount === 0) {
|
||||||
echo "<p>Création du premier compte administrateur...</p>";
|
echo "<p>Création du premier compte administrateur...</p>";
|
||||||
$adminUsername = 'admin';
|
$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);
|
$adminPasswordHashed = password_hash($adminPasswordPlain, PASSWORD_DEFAULT);
|
||||||
|
|
||||||
$stmt = $dbInstance->prepare("INSERT INTO users (username, password, role) VALUES (?, ?, ?)");
|
$stmt = $dbInstance->prepare("INSERT INTO users (username, password, role) VALUES (?, ?, ?)");
|
||||||
$stmt->execute([$adminUsername, $adminPasswordHashed, 'admin']);
|
$stmt->execute([$adminUsername, $adminPasswordHashed, 'admin']);
|
||||||
$logService->log('info', "Compte administrateur '$adminUsername' créé.", $stmt->lastInsertId(), $_SERVER['REMOTE_ADDR']);
|
$userId = $dbInstance->lastInsertId(); // Récupérer l'ID de l'utilisateur créé
|
||||||
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>";
|
$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']);
|
||||||
|
|
||||||
echo "<p>Initialisation terminée. Redirection vers la page de connexion dans 5 secondes...</p>";
|
echo "<p>Initialisation terminée. Redirection vers la page de connexion dans 5 secondes...</p>";
|
||||||
echo "</div></body></html>";
|
echo "</div></body></html>";
|
||||||
// Redirection automatique après l'initialisation
|
// Redirection automatique après l'initialisation
|
||||||
|
@ -3,6 +3,16 @@
|
|||||||
# Ce script crée le certificat Root CA (Certificate Authority) auto-signé.
|
# 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.
|
# 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_CA_DIR="/opt/tls/root"
|
||||||
ROOT_KEY="$ROOT_CA_DIR/private/ca.key.pem"
|
ROOT_KEY="$ROOT_CA_DIR/private/ca.key.pem"
|
||||||
ROOT_CERT="$ROOT_CA_DIR/certs/ca.cert.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é
|
# Générer le certificat Root CA auto-signé
|
||||||
openssl req -x509 -new -nodes -key "$ROOT_KEY" -sha256 -days 3650 -out "$ROOT_CERT" \
|
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
|
-config "$ROOT_CNF" -extensions v3_ca
|
||||||
|
|
||||||
chmod 444 "$ROOT_CERT" # Permissions en lecture seule pour le certificat
|
chmod 444 "$ROOT_CERT" # Permissions en lecture seule pour le certificat
|
||||||
|
Reference in New Issue
Block a user