- fix de la creation du .pfx & optimisation

This commit is contained in:
Frogg 2026-05-13 09:43:29 +02:00
parent b209f850a2
commit d375f0ca4c
4 changed files with 180 additions and 110 deletions

View File

@ -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_WILDCARD="*.server.home"
CONFIG_DEB_INSTALL_DEFAULT_CA_SERVICES="gitea nginx apache2 mysql postgresql jellyfin" 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_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_CRON_UPDATE="CONFIG_DEB_INSTALL_CRON_UPDATE"
CONFIG_DEB_INSTALL_JSON='[ CONFIG_DEB_INSTALL_JSON='[

Binary file not shown.

View File

@ -135,8 +135,8 @@ check_deb_sys_clone_ssh_key(){
} }
check_deb_sys_cert_install(){ check_deb_sys_cert_install(){
local MARKER="# $CONFIG_DEB_INSTALL_DEFAULT_CA_CRON" local marker="# $CONFIG_DEB_INSTALL_DEFAULT_CA_CRON"
if crontab -l 2>/dev/null | grep -q "$MARKER"; then if crontab -l 2>/dev/null | grep -q "$marker"; then
#return 0 #return 0
return 1 return 1
else else
@ -145,8 +145,8 @@ check_deb_sys_cert_install(){
} }
check_deb_sys_script_update(){ check_deb_sys_script_update(){
local MARKER="# $CONFIG_DEB_INSTALL_CRON_UPDATE" local marker="# $CONFIG_DEB_INSTALL_CRON_UPDATE"
if crontab -l 2>/dev/null | grep -q "$MARKER"; then if crontab -l 2>/dev/null | grep -q "$marker"; then
#return 0 #return 0
return 1 return 1
else else
@ -563,108 +563,174 @@ EOF"
do_deb_sys_cert_install(){ 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 ===" msg_info "=== Configuration Automatisée du Client PKI ==="
# 1. Saisie des informations de base # 1. Saisie des informations de base
read -rp "IP du serveur CA [${CONFIG_DEB_INSTALL_DEFAULT_CA_SERVER}] : " INPUT_IP read -rp "IP du serveur CA [${CONFIG_DEB_INSTALL_DEFAULT_CA_SERVER}] : " input_ip
CA_IP=${INPUT_IP:-${CONFIG_DEB_INSTALL_DEFAULT_CA_SERVER}} ca_ip=${input_ip:-${CONFIG_DEB_INSTALL_DEFAULT_CA_SERVER}}
read -rp "Domaine Wildcard [${CONFIG_DEB_INSTALL_DEFAULT_CA_WILDCARD}] : " INPUT_DOMAIN 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é # Petit bonus : on s'assure que le ca_url est bien formé
CA_URL="https://$(echo "$CA_IP" | sed 's|https://||')" #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 # 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 # 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 2>/dev/null | openssl x509 -fingerprint -sha256 -noout | cut -d'=' -f2 | tr -d ':') ca_fingerprint=$(openssl s_client -connect "${ca_ip}:443" </dev/null 2>/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." msg_error "Erreur : Impossible de contacter le serveur sur le port 443. Vérifie l'IP."
exit 1 return 1
fi 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 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 # On télécharge une version stable spécifique
VERSION="0.24.4" #VERSION="0.24.4"
URL="https://github.com/smallstep/cli/releases/download/v${VERSION}/step-cli_${VERSION}_amd64.deb" #URL="https://github.com/smallstep/cli/releases/download/v${VERSION}/step-cli_${VERSION}_amd64.deb"
#if wget -q $URL -O /tmp/step.deb; then
wget -q $URL -O /tmp/step.deb # dpkg -i /tmp/step.deb > /dev/null 2>&1
# rm /tmp/step.deb
if [ $? -eq 0 ]; then #else
dpkg -i /tmp/step.deb > /dev/null 2>&1 # msg_error "Échec du téléchargement du paquet .deb"
rm /tmp/step.deb # return 1
else #fi
msg_error "Échec du téléchargement du paquet .deb" else
exit 1 msg_success "paquet Step CLI déjà installé"
fi
fi 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 # 1. On force un environnement de travail propre
export STEPPATH="/tmp/step-config" step_path="/tmp/step-config"
rm -rf "$STEPPATH" rm -rf "$step_path"
mkdir -p "$STEPPATH" mkdir -p "$step_path"
# 2. Utilisation de la Fingerprint confirmée # 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) # 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é # 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 # 4. Génération du Wildcard
mkdir -p /etc/ssl/wildcard mkdir -p "${CONFIG_DEB_INSTALL_DEFAULT_CA_INSTALL_PATH}"
BASE_DOMAIN=$(echo "$WILDCARD_DOMAIN" | sed 's/\*\.//') base_domain=$(echo "$wildcard_domain" | sed 's/\*\.//')
step ca certificate "$WILDCARD_DOMAIN" /etc/ssl/wildcard/server.crt /etc/ssl/wildcard/server.key \ echo "### THIS IS A TEST ###"
--ca-url "$CA_URL" \ echo "### THIS IS A TEST ###"
--root "$ROOT_CRT" \ echo "### THIS IS A TEST ### $base_domain"
--san "$WILDCARD_DOMAIN" \
--san "$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 \ --not-after=8760h \
--force --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 # 1. Définition des chemins
# On s'assure de retrouver le fichier même si la variable a sauté # On s'assure de retrouver le fichier même si la variable a sauté
local TEMP_ROOT="/tmp/step-config/certs/root_ca.crt" temp_root="/tmp/step-config/certs/root_ca.crt"
local SYSTEM_TARGET="/usr/local/share/ca-certificates/step-ca-frogg.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' # 2. On nettoie le certificat (format PEM pur) pour éviter l'erreur 'rehash'
# Cela extrait uniquement le certificat et ignore le texte inutile # 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) # 3. Mise à jour du magasin (sans --fresh pour éviter les warnings inutiles)
update-ca-certificates > /dev/null 2>&1 if update-ca-certificates > /dev/null 2>&1; then
# 4. Vérification réelle
if [ $? -eq 0 ]; then
msg_success "Le système fait maintenant confiance au Root CA Frogg." msg_success "Le système fait maintenant confiance au Root CA Frogg."
else else
msg_error "Échec lors de la mise à jour des certificats système." msg_error "Échec lors de la mise à jour des certificats système."
fi fi
else 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 fi
# ---(Cron & Nettoyage final) --- # ---(Cron & Nettoyage final) ---
@ -672,18 +738,18 @@ do_deb_sys_cert_install(){
rm -rf "/tmp/step-config" 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 # Fichiers de certificats
local cert_dir="/etc/ssl/wildcard" cert_dir="${CONFIG_DEB_INSTALL_DEFAULT_CA_INSTALL_PATH}"
local cert_crt="${cert_dir}/server.crt" cert_crt="${cert_dir}/server.crt"
local cert_key="${cert_dir}/server.key" cert_key="${cert_dir}/server.key"
local cert_pfx="${cert_dir}/server.pfx" cert_pfx="${cert_dir}/server.pfx"
# Groupe utilisé pour l'accès aux certificats # Groupe utilisé pour l'accès aux certificats
local cert_group="ssl-cert" cert_group="ssl-cert"
# Création du groupe si nécessaire # Création du groupe si nécessaire
groupadd -f "$cert_group" groupadd -f "$cert_group"
@ -697,10 +763,13 @@ do_deb_sys_cert_install(){
chmod 640 "$cert_key" "$cert_pfx" 2>/dev/null chmod 640 "$cert_key" "$cert_pfx" 2>/dev/null
chmod 644 "$cert_crt" 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 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" unit="${svc%.service}.service"
@ -747,30 +816,14 @@ do_deb_sys_cert_install(){
fi fi
done 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) # Détection du groupe actuel du dossier (normalement ssl-cert)
local current_group
current_group="$(stat -c '%G' "$cert_dir")" 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 # Commande de génération du PFX
# IMPORTANT: # IMPORTANT:
@ -778,24 +831,13 @@ do_deb_sys_cert_install(){
# - -passout pass: pour mot de passe vide # - -passout pass: pour mot de passe vide
# - exporte la chaîne complète via -certfile si fullchain.crt existe # - exporte la chaîne complète via -certfile si fullchain.crt existe
# ------------------------------------------------------------------ # ------------------------------------------------------------------
local pfx_input="$cert_crt" pfx_input="$cert_crt"
local cert_fullchain="${cert_dir}/fullchain.crt" cert_fullchain="${cert_dir}/fullchain.crt"
if [[ -f "$cert_fullchain" ]]; then if [[ -f "$cert_fullchain" ]]; then
pfx_input="$cert_fullchain" pfx_input="$cert_fullchain"
fi 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 \ pfx_cmd="openssl pkcs12 -export \
-out \"$cert_pfx\" \ -out \"$cert_pfx\" \
-inkey \"$cert_key\" \ -inkey \"$cert_key\" \
@ -805,15 +847,40 @@ do_deb_sys_cert_install(){
&& chown root:\"$current_group\" \"$cert_pfx\" \ && chown root:\"$current_group\" \"$cert_pfx\" \
&& chmod 640 \"$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 # Construction de la liste des services à redémarrer
# ------------------------------------------------------------------ # ------------------------------------------------------------------
local restart_cmd=""
if [[ ${#active_services[@]} -gt 0 ]]; then if [[ ${#active_services[@]} -gt 0 ]]; then
restart_cmd="systemctl restart" restart_cmd="systemctl restart"
local unit
for unit in "${active_services[@]}"; do for unit in "${active_services[@]}"; do
restart_cmd+=" \"$unit\"" restart_cmd+=" \"$unit\""
done done
@ -822,7 +889,7 @@ do_deb_sys_cert_install(){
# ------------------------------------------------------------------ # ------------------------------------------------------------------
# Commande complète du cron # Commande complète du cron
# ------------------------------------------------------------------ # ------------------------------------------------------------------
local full_command
full_command="$renew_cmd >> /var/log/cert-renew.log 2>&1 \ full_command="$renew_cmd >> /var/log/cert-renew.log 2>&1 \
&& $pfx_cmd \ && $pfx_cmd \
&& chown root:\"$current_group\" \"$cert_key\" \"$cert_crt\" \ && chown root:\"$current_group\" \"$cert_key\" \"$cert_crt\" \
@ -831,6 +898,7 @@ do_deb_sys_cert_install(){
if [[ -n "$restart_cmd" ]]; then if [[ -n "$restart_cmd" ]]; then
full_command+=" && $restart_cmd" full_command+=" && $restart_cmd"
msg_success "Creation de la commande Cron."
fi fi
# ------------------------------------------------------------------ # ------------------------------------------------------------------
@ -842,14 +910,14 @@ do_deb_sys_cert_install(){
# ------------------------------------------------------------------ # ------------------------------------------------------------------
# Exécution immédiate de la génération du PFX # Exécution immédiate de la génération du PFX
# ------------------------------------------------------------------ # ------------------------------------------------------------------
if eval "$pfx_cmd"; then #if eval "$pfx_cmd"; then
chown root:"$current_group" "$cert_key" "$cert_crt" # chown root:"$current_group" "$cert_key" "$cert_crt"
chmod 640 "$cert_key" # chmod 640 "$cert_key"
chmod 644 "$cert_crt" # chmod 644 "$cert_crt"
msg_success "Fichier PFX généré avec succès." # msg_success "Fichier PFX généré avec succès."
else #else
msg_error "Échec de la génération du fichier PFX." # msg_error "Échec de la génération du fichier PFX."
fi #fi
# ------------------------------------------------------------------ # ------------------------------------------------------------------
# Redémarrage final (sécurité) # Redémarrage final (sécurité)
@ -862,12 +930,12 @@ do_deb_sys_cert_install(){
fi fi
done 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 " ################################" msg_success " ################################"
msg_success " # Tout est prêt et configuré ! # " msg_success " # Tout est prêt et configuré ! # "
msg_success " ###########(/etc/ssl/wildcard/)#" msg_success " ###########(${CONFIG_DEB_INSTALL_DEFAULT_CA_INSTALL_PATH}/)#"
msg_success " " msg_success " "
} }