diff --git a/config/config_install.sh b/config/config_install.sh index 9a9621f..d724160 100644 --- a/config/config_install.sh +++ b/config/config_install.sh @@ -6,6 +6,8 @@ CONFIG_DEB_INSTALL_DEFAULT_CA_SERVER="192.168.0.110" CONFIG_DEB_INSTALL_DEFAULT_CA_WILDCARD="*.server.home" CONFIG_DEB_INSTALL_DEFAULT_CA_SERVICES="gitea nginx apache2 mysql postgresql jellyfin" CONFIG_DEB_INSTALL_DEFAULT_CA_CRON="STEP-CA-RENEWAL" +CONFIG_DEB_INSTALL_DEFAULT_CA_STEP="step-cli_0.24.4_amd64.deb" +CONFIG_DEB_INSTALL_DEFAULT_CA_INSTALL_PATH="/etc/ssl/wildcard" CONFIG_DEB_INSTALL_CRON_UPDATE="CONFIG_DEB_INSTALL_CRON_UPDATE" CONFIG_DEB_INSTALL_JSON='[ diff --git a/doc/frogg-ca.crt b/doc/frogg-ca-client.crt similarity index 100% rename from doc/frogg-ca.crt rename to doc/frogg-ca-client.crt diff --git a/doc/step-cli_0.24.4_amd64.deb b/doc/step-cli_0.24.4_amd64.deb new file mode 100644 index 0000000..396a2c6 Binary files /dev/null and b/doc/step-cli_0.24.4_amd64.deb differ diff --git a/func/deb_sys.sh b/func/deb_sys.sh index 8b464c1..c1d4c40 100644 --- a/func/deb_sys.sh +++ b/func/deb_sys.sh @@ -135,8 +135,8 @@ check_deb_sys_clone_ssh_key(){ } check_deb_sys_cert_install(){ - local MARKER="# $CONFIG_DEB_INSTALL_DEFAULT_CA_CRON" - if crontab -l 2>/dev/null | grep -q "$MARKER"; then + local marker="# $CONFIG_DEB_INSTALL_DEFAULT_CA_CRON" + if crontab -l 2>/dev/null | grep -q "$marker"; then #return 0 return 1 else @@ -145,8 +145,8 @@ check_deb_sys_cert_install(){ } check_deb_sys_script_update(){ - local MARKER="# $CONFIG_DEB_INSTALL_CRON_UPDATE" - if crontab -l 2>/dev/null | grep -q "$MARKER"; then + local marker="# $CONFIG_DEB_INSTALL_CRON_UPDATE" + if crontab -l 2>/dev/null | grep -q "$marker"; then #return 0 return 1 else @@ -563,108 +563,174 @@ EOF" do_deb_sys_cert_install(){ - local CA_IP WILDCARD_DOMAIN CA_URL CA_FINGERPRINT BASE_DOMAIN MARKER VERSION URL ROOT_CRT + local ca_ip wildcard_domain ca_url ca_fingerprint base_domain marker root_crt input_ip step_path temp_root \ + system_target inter_target server_crt cert_group load_state unit svc_user current_group \ + cert_dir cert_crt cert_key cert_key cert_pfx pfx_cmd pfx_input step_bin renew_cmd restart_cmd="" \ + unit full_command cert_fullchain msg_info "=== Configuration Automatisée du Client PKI ===" # 1. Saisie des informations de base - read -rp "IP du serveur CA [${CONFIG_DEB_INSTALL_DEFAULT_CA_SERVER}] : " INPUT_IP - CA_IP=${INPUT_IP:-${CONFIG_DEB_INSTALL_DEFAULT_CA_SERVER}} + read -rp "IP du serveur CA [${CONFIG_DEB_INSTALL_DEFAULT_CA_SERVER}] : " input_ip + ca_ip=${input_ip:-${CONFIG_DEB_INSTALL_DEFAULT_CA_SERVER}} read -rp "Domaine Wildcard [${CONFIG_DEB_INSTALL_DEFAULT_CA_WILDCARD}] : " INPUT_DOMAIN - WILDCARD_DOMAIN=${INPUT_DOMAIN:-${CONFIG_DEB_INSTALL_DEFAULT_CA_WILDCARD}} + wildcard_domain=${INPUT_DOMAIN:-${CONFIG_DEB_INSTALL_DEFAULT_CA_WILDCARD}} - # Petit bonus : on s'assure que le CA_URL est bien formé - CA_URL="https://$(echo "$CA_IP" | sed 's|https://||')" + # Petit bonus : on s'assure que le ca_url est bien formé + #ca_url="https://$(echo "$ca_ip" | sed 's|https://||')" - echo -e "Configuration retenue : IP=$CA_IP | Domaine=$WILDCARD_DOMAIN" + echo -e "Configuration retenue : IP=$ca_ip | Domaine=$wildcard_domain" - CA_URL="https://$CA_IP" + ca_url="https://$ca_ip" + + # ================================================================== + # [1/7] Récupération de l'empreinte via HTTPS + # ================================================================== # 2. Récupération automatique de la Fingerprint via HTTPS - msg_warning "[1/6] Récupération de l'empreinte via HTTPS..." + msg_warning "[1/7] Récupération de l'empreinte via HTTPS..." # Cette commande récupère le certificat du serveur et calcule son empreinte SHA256 - CA_FINGERPRINT=$(openssl s_client -connect "${CA_IP}:443" /dev/null | openssl x509 -fingerprint -sha256 -noout | cut -d'=' -f2 | tr -d ':') + ca_fingerprint=$(openssl s_client -connect "${ca_ip}:443" /dev/null | openssl x509 -fingerprint -sha256 -noout | cut -d'=' -f2 | tr -d ':') - if [ -z "$CA_FINGERPRINT" ]; then + if [ -z "$ca_fingerprint" ]; then msg_error "Erreur : Impossible de contacter le serveur sur le port 443. Vérifie l'IP." - exit 1 + return 1 fi - msg_info "Empreinte détectée : ${GREEN}$CA_FINGERPRINT${NONE}" + msg_info "Empreinte détectée : ${GREEN}$ca_fingerprint${NONE}" - # 3. Installation de Step CLI (si besoin) + # ================================================================== + # [2/7] Installation du paquet Step CLI + # ================================================================== + + msg_warning "[2/7] Installation du paquet Step CLI..." + + # Installation de Step CLI (si besoin) if ! command -v step &> /dev/null; then - msg_warning "[2/6] Installation du paquet Step CLI..." + + if dpkg -i "${WELCOME_SCRIPT_PATH}/doc/${CONFIG_DEB_INSTALL_DEFAULT_CA_STEP}" > /dev/null 2>&1; then + msg_success "Installation du paquet ${CONFIG_DEB_INSTALL_DEFAULT_CA_STEP}" + else + msg_error "Échec de l'installation du paquet ${CONFIG_DEB_INSTALL_DEFAULT_CA_STEP}" + return 1 + fi # On télécharge une version stable spécifique - VERSION="0.24.4" - URL="https://github.com/smallstep/cli/releases/download/v${VERSION}/step-cli_${VERSION}_amd64.deb" - - wget -q $URL -O /tmp/step.deb - - if [ $? -eq 0 ]; then - dpkg -i /tmp/step.deb > /dev/null 2>&1 - rm /tmp/step.deb - else - msg_error "Échec du téléchargement du paquet .deb" - exit 1 - fi + #VERSION="0.24.4" + #URL="https://github.com/smallstep/cli/releases/download/v${VERSION}/step-cli_${VERSION}_amd64.deb" + #if wget -q $URL -O /tmp/step.deb; then + # dpkg -i /tmp/step.deb > /dev/null 2>&1 + # rm /tmp/step.deb + #else + # msg_error "Échec du téléchargement du paquet .deb" + # return 1 + #fi + else + msg_success "paquet Step CLI déjà installé" fi - # 4. Configuration et Certificat - msg_warning "[3/6] Liaison et génération du certificat..." + # ================================================================== + # [3/7] Liaison et génération du certificat + # ================================================================== + + # Configuration et Certificat + msg_warning "[3/7] Liaison et génération du certificat..." # 1. On force un environnement de travail propre - export STEPPATH="/tmp/step-config" - rm -rf "$STEPPATH" - mkdir -p "$STEPPATH" + step_path="/tmp/step-config" + rm -rf "$step_path" + mkdir -p "$step_path" # 2. Utilisation de la Fingerprint confirmée - CA_FINGERPRINT="4873b9eaeb8a7643475939b4035221bd1bc3acd0db00e94df5a76d771459f439" + #ca_fingerprint="4873b9eaeb8a7643475939b4035221bd1bc3acd0db00e94df5a76d771459f439" + root_ca_fingerprint=$(ssh "root@${ca_ip}" "step certificate fingerprint /var/lib/step-ca/.step/certs/root_ca.crt") + + if [ -z "$root_ca_fingerprint" ]; then + msg_error " Impossible de récupérer le fingerprint." + return 1 + fi # 3. Liaison (Bootstrap) - step ca bootstrap --ca-url "$CA_URL" --fingerprint "$CA_FINGERPRINT" --force + step ca bootstrap --ca-url "$ca_url" --fingerprint "$root_ca_fingerprint" --force # Chemin du certificat racine récupéré - ROOT_CRT="$STEPPATH/certs/root_ca.crt" + root_crt="$step_path/certs/root_ca.crt" # 4. Génération du Wildcard - mkdir -p /etc/ssl/wildcard - BASE_DOMAIN=$(echo "$WILDCARD_DOMAIN" | sed 's/\*\.//') + mkdir -p "${CONFIG_DEB_INSTALL_DEFAULT_CA_INSTALL_PATH}" + base_domain=$(echo "$wildcard_domain" | sed 's/\*\.//') - step ca certificate "$WILDCARD_DOMAIN" /etc/ssl/wildcard/server.crt /etc/ssl/wildcard/server.key \ - --ca-url "$CA_URL" \ - --root "$ROOT_CRT" \ - --san "$WILDCARD_DOMAIN" \ - --san "$BASE_DOMAIN" \ + echo "### THIS IS A TEST ###" + echo "### THIS IS A TEST ###" + echo "### THIS IS A TEST ### $base_domain" + + base_domain="${wildcard_domain#*.}" + + echo "### THIS IS A TEST ###" + echo "### THIS IS A TEST ###" + echo "### THIS IS A TEST ### $base_domain" + + + step ca certificate "$wildcard_domain" \ + "${CONFIG_DEB_INSTALL_DEFAULT_CA_INSTALL_PATH}/server.crt" \ + "${CONFIG_DEB_INSTALL_DEFAULT_CA_INSTALL_PATH}/server.key" \ + --ca-url "$ca_url" \ + --root "$root_crt" \ + --san "$wildcard_domain" \ + --san "$base_domain" \ --not-after=8760h \ --force - msg_success "Certificat généré avec succès dans /etc/ssl/wildcard/" + msg_success "Certificat généré avec succès dans ${CONFIG_DEB_INSTALL_DEFAULT_CA_INSTALL_PATH}/" - msg_warning "[4/6] Installation automatique du Root CA..." + # ================================================================== + # [4/7] Installation automatique du Root CA + # ================================================================== + + msg_warning "[4/7] Installation automatique du Root CA..." # 1. Définition des chemins # On s'assure de retrouver le fichier même si la variable a sauté - local TEMP_ROOT="/tmp/step-config/certs/root_ca.crt" - local SYSTEM_TARGET="/usr/local/share/ca-certificates/step-ca-frogg.crt" + temp_root="/tmp/step-config/certs/root_ca.crt" + system_target="/usr/local/share/ca-certificates/step-ca-frogg.crt" + inter_target="/usr/local/share/ca-certificates/step-ca-intermediate-frogg.crt" - if [ -f "$TEMP_ROOT" ]; then + ### --- SECTION INTERMEDIATE --- ### + + # Chemins pour l'intermédiaire + server_crt="${CONFIG_DEB_INSTALL_DEFAULT_CA_INSTALL_PATH}/server.crt" # Ton cert généré par step + + if [ -f "$server_crt" ]; then + # On extrait le DEUXIÈME certificat du fichier (l'intermédiaire) + # On utilise awk pour isoler le second bloc -----BEGIN...END----- + awk 'split($0,a,"-----END CERTIFICATE-----"){print a[1] "-----END CERTIFICATE-----"}' "$server_crt" | tail -n +2 | awk '/-----BEGIN CERTIFICATE-----/,/-----END CERTIFICATE-----/' > "$inter_target" + + if [ -s "$inter_target" ]; then + msg_success "Certificat intermédiaire extrait avec succès." + else + # Si awk échoue ou que le fichier est simple, on peut tenter un téléchargement direct + msg_warn "Extraction échouée, tentative de récupération via step..." + step ca root "$inter_target" --ca-url "$ca_url" --fingerprint "$ca_fingerprint" --force > /dev/null 2>&1 + fi + else + msg_warn "server.crt introuvable, impossible d'extraire l'intermédiaire pour le moment." + fi + + ### --- FIN SECTION INTERMEDIATE --- ### + + if [ -f "$temp_root" ]; then # 2. On nettoie le certificat (format PEM pur) pour éviter l'erreur 'rehash' # Cela extrait uniquement le certificat et ignore le texte inutile - openssl x509 -in "$TEMP_ROOT" -out "$SYSTEM_TARGET" + openssl x509 -in "$temp_root" -out "$system_target" # 3. Mise à jour du magasin (sans --fresh pour éviter les warnings inutiles) - update-ca-certificates > /dev/null 2>&1 - - # 4. Vérification réelle - if [ $? -eq 0 ]; then + if update-ca-certificates > /dev/null 2>&1; then msg_success "Le système fait maintenant confiance au Root CA Frogg." else msg_error "Échec lors de la mise à jour des certificats système." fi else - msg_error "Source introuvable dans $TEMP_ROOT. Vérifie que l'étape 3 a réussi." + msg_error "Source introuvable dans $temp_root. Vérifie que l'étape 3 a réussi." fi # ---(Cron & Nettoyage final) --- @@ -672,18 +738,18 @@ do_deb_sys_cert_install(){ rm -rf "/tmp/step-config" # ================================================================== - # [5/6] ATTRIBUTION DES DROITS + # [5/7] ATTRIBUTION DES DROITS # ================================================================== - msg_warning "[5/6] Finalisation des droits et redémarrage des services..." + msg_warning "[5/7] Finalisation des droits et redémarrage des services..." # Fichiers de certificats - local cert_dir="/etc/ssl/wildcard" - local cert_crt="${cert_dir}/server.crt" - local cert_key="${cert_dir}/server.key" - local cert_pfx="${cert_dir}/server.pfx" + cert_dir="${CONFIG_DEB_INSTALL_DEFAULT_CA_INSTALL_PATH}" + cert_crt="${cert_dir}/server.crt" + cert_key="${cert_dir}/server.key" + cert_pfx="${cert_dir}/server.pfx" # Groupe utilisé pour l'accès aux certificats - local cert_group="ssl-cert" + cert_group="ssl-cert" # Création du groupe si nécessaire groupadd -f "$cert_group" @@ -697,10 +763,13 @@ do_deb_sys_cert_install(){ chmod 640 "$cert_key" "$cert_pfx" 2>/dev/null chmod 644 "$cert_crt" 2>/dev/null - # Parcours des services configurés + # Groupe utilisé pour l'accès aux certificats + cert_group="ssl-cert" + + # Parcours des services configurés pour ajouter l utilisateur au groupe ssl for svc in $CONFIG_DEB_INSTALL_DEFAULT_CA_SERVICES; do - local load_state unit svc_user + load_state unit svc_user unit="${svc%.service}.service" @@ -747,30 +816,14 @@ do_deb_sys_cert_install(){ fi done - # ================================================================== - # [6/6] PLANIFICATION & GÉNÉRATION PFX + # [6/7] GÉNÉRATION PFX # ================================================================== - msg_warning "[6/6] Activation du renouvellement automatique..." + msg_warning "[6/7] Génération du .pfx..." # Détection du groupe actuel du dossier (normalement ssl-cert) - local current_group current_group="$(stat -c '%G' "$cert_dir")" - # Binaire step - local step_bin - step_bin="$(command -v step)" - if [[ -z "$step_bin" ]]; then - msg_error "Le binaire 'step' est introuvable." - return 1 - fi - - # ------------------------------------------------------------------ - # Commande de renouvellement - # ------------------------------------------------------------------ - local renew_cmd - renew_cmd="$step_bin certificate renew \"$cert_crt\" \"$cert_key\" --force" - # ------------------------------------------------------------------ # Commande de génération du PFX # IMPORTANT: @@ -778,24 +831,13 @@ do_deb_sys_cert_install(){ # - -passout pass: pour mot de passe vide # - exporte la chaîne complète via -certfile si fullchain.crt existe # ------------------------------------------------------------------ - local pfx_input="$cert_crt" - local cert_fullchain="${cert_dir}/fullchain.crt" + pfx_input="$cert_crt" + cert_fullchain="${cert_dir}/fullchain.crt" if [[ -f "$cert_fullchain" ]]; then pfx_input="$cert_fullchain" fi - local pfx_cmd -# pfx_cmd="openssl pkcs12 -export \ -# -out \"$cert_pfx\" \ -# -inkey \"$cert_key\" \ -# -in \"$pfx_input\" \ -# -certfile \"$pfx_input\" \ -# -passout pass: \ -# -legacy \ -# && chown root:\"$current_group\" \"$cert_pfx\" \ -# && chmod 640 \"$cert_pfx\"" - pfx_cmd="openssl pkcs12 -export \ -out \"$cert_pfx\" \ -inkey \"$cert_key\" \ @@ -805,15 +847,40 @@ do_deb_sys_cert_install(){ && chown root:\"$current_group\" \"$cert_pfx\" \ && chmod 640 \"$cert_pfx\"" + if eval "$pfx_cmd"; then + # chown root:"$current_group" "$cert_key" "$cert_crt" + # chmod 640 "$cert_key" + # chmod 644 "$cert_crt" + msg_success "Fichier PFX généré avec succès." + else + msg_error "Échec de la génération du fichier PFX." + fi + + # ================================================================== + # [7/7] PLANIFICATION + # ================================================================== + msg_warning "[7/7] Activation du renouvellement automatique..." + + step_bin="$(command -v step)" + if [[ -z "$step_bin" ]]; then + msg_error "Le binaire 'step' est introuvable." + return 1 + fi + + # ------------------------------------------------------------------ + # Commande de renouvellement + # ------------------------------------------------------------------ + + renew_cmd="$step_bin certificate renew \"$cert_crt\" \"$cert_key\" --force" # ------------------------------------------------------------------ # Construction de la liste des services à redémarrer # ------------------------------------------------------------------ - local restart_cmd="" + if [[ ${#active_services[@]} -gt 0 ]]; then restart_cmd="systemctl restart" - local unit + for unit in "${active_services[@]}"; do restart_cmd+=" \"$unit\"" done @@ -822,7 +889,7 @@ do_deb_sys_cert_install(){ # ------------------------------------------------------------------ # Commande complète du cron # ------------------------------------------------------------------ - local full_command + full_command="$renew_cmd >> /var/log/cert-renew.log 2>&1 \ && $pfx_cmd \ && chown root:\"$current_group\" \"$cert_key\" \"$cert_crt\" \ @@ -831,6 +898,7 @@ do_deb_sys_cert_install(){ if [[ -n "$restart_cmd" ]]; then full_command+=" && $restart_cmd" + msg_success "Creation de la commande Cron." fi # ------------------------------------------------------------------ @@ -842,14 +910,14 @@ do_deb_sys_cert_install(){ # ------------------------------------------------------------------ # Exécution immédiate de la génération du PFX # ------------------------------------------------------------------ - if eval "$pfx_cmd"; then - chown root:"$current_group" "$cert_key" "$cert_crt" - chmod 640 "$cert_key" - chmod 644 "$cert_crt" - msg_success "Fichier PFX généré avec succès." - else - msg_error "Échec de la génération du fichier PFX." - fi + #if eval "$pfx_cmd"; then + # chown root:"$current_group" "$cert_key" "$cert_crt" + # chmod 640 "$cert_key" + # chmod 644 "$cert_crt" + # msg_success "Fichier PFX généré avec succès." + #else + # msg_error "Échec de la génération du fichier PFX." + #fi # ------------------------------------------------------------------ # Redémarrage final (sécurité) @@ -862,12 +930,12 @@ do_deb_sys_cert_install(){ fi done - msg_success "Infrastructure PKI prête. Groupe : $CURRENT_GROUP" + msg_success "Infrastructure PKI prête. Groupe : $current_group" msg_success " " msg_success " ################################" msg_success " # Tout est prêt et configuré ! # " - msg_success " ###########(/etc/ssl/wildcard/)#" + msg_success " ###########(${CONFIG_DEB_INSTALL_DEFAULT_CA_INSTALL_PATH}/)#" msg_success " " } \ No newline at end of file