- Ajout des droits pfx

This commit is contained in:
Frogg 2026-05-10 15:46:53 +02:00
parent 134d7a4166
commit 7fea497dbe
1 changed files with 153 additions and 75 deletions

View File

@ -609,9 +609,7 @@ do_deb_sys_cert_install(){
--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 /etc/ssl/wildcard/"
msg_warning "[4/6] Installation automatique du Root CA..."
@ -638,115 +636,195 @@ do_deb_sys_cert_install(){
msg_error "Source introuvable dans $TEMP_ROOT. Vérifie que l'étape 3 a réussi."
fi
# --- ÉTAPE 6 (Cron & Nettoyage final) ---
# ---(Cron & Nettoyage final) ---
# C'est seulement MAINTENANT qu'on peut supprimer
#rm -rf "/tmp/step-config"
rm -rf "/tmp/step-config"
# ==================================================================
# [5/6] ATTRIBUTION DES DROITS (D'abord les droits, ensuite le cron)
# [5/6] ATTRIBUTION DES DROITS
# ==================================================================
msg_warning "[5/6] Finalisation des droits et redémarrage des services..."
# 1. On s'assure que le groupe technique existe
groupadd -f ssl-cert
# 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"
# Boucle sur la liste des services
for SVC in $CONFIG_DEB_INSTALL_DEFAULT_CA_SERVICES; do
# Groupe utilisé pour l'accès aux certificats
local cert_group="ssl-cert"
# Normalisation du nom
UNIT="${SVC%.service}.service"
# Création du groupe si nécessaire
groupadd -f "$cert_group"
# Vérification réelle de l'existence du service
LOAD_STATE=$(systemctl show "$UNIT" --property=LoadState --value 2>/dev/null)
# Liste des services valides et actifs (utilisée aussi pour le cron)
local -a active_services=()
local -A processed_users=()
if [ "$LOAD_STATE" != "loaded" ]; then
# Service inexistant, on passe au suivant
continue
fi
# Permissions de base (appliquées une seule fois)
chown root:"$cert_group" "$cert_key" "$cert_pfx" 2>/dev/null
chmod 640 "$cert_key" "$cert_pfx" 2>/dev/null
chmod 644 "$cert_crt" 2>/dev/null
# Parcours des services configurés
for svc in $CONFIG_DEB_INSTALL_DEFAULT_CA_SERVICES; do
local unit="${svc%.service}.service"
local load_state
local svc_user
local pid
# Vérifie que l'unité existe réellement
load_state="$(systemctl show "$unit" --property=LoadState --value 2>/dev/null)"
[[ "$load_state" != "loaded" ]] && continue
# Vérifie que le service est actif
if ! systemctl is-active --quiet "$UNIT"; then
continue
fi
systemctl is-active --quiet "$unit" || continue
# Recherche d'un PID
PID=$(pgrep -f "${SVC%.service}" | head -n1)
[ -z "$PID" ] && continue
# Ajout à la liste des services à redémarrer
active_services+=("$unit")
# Utilisateur du processus
SVC_USER=$(ps -o user= -p "$PID" | tr -d ' ')
[ -z "$SVC_USER" ] && continue
# Récupération de l'utilisateur défini dans le service (plus fiable que pgrep/ps)
svc_user="$(systemctl show "$unit" --property=User --value 2>/dev/null)"
# Si User= n'est pas défini, systemd exécute le service en root
[[ -z "$svc_user" ]] && svc_user="root"
# Ignore root
if [ ! "$SVC_USER" = "root" ]; then
[[ "$svc_user" == "root" ]] && continue
msg_info "🔧 Configuration de $UNIT (Utilisateur : $SVC_USER)"
# Évite de traiter plusieurs fois le même utilisateur
[[ -n "${processed_users[$svc_user]}" ]] && continue
processed_users["$svc_user"]=1
# Ajout au groupe ssl-cert
usermod -aG ssl-cert "$SVC_USER"
msg_info "🔧 Configuration de $unit (Utilisateur : $svc_user)"
# Permissions certificats
chown root:ssl-cert /etc/ssl/wildcard/server.key /etc/ssl/wildcard/server.pfx
chmod 640 /etc/ssl/wildcard/server.key /etc/ssl/wildcard/server.pfx
chmod 644 /etc/ssl/wildcard/server.crt
fi
# Redémarrage
if systemctl restart "$UNIT"; then
msg_success "Service $UNIT redémarré avec succès."
# Ajout de l'utilisateur au groupe ssl-cert
if usermod -aG "$cert_group" "$svc_user"; then
msg_success "Utilisateur $svc_user ajouté au groupe $cert_group."
else
msg_error "Impossible de redémarrer $UNIT."
msg_error "Impossible d'ajouter $svc_user au groupe $cert_group."
continue
fi
done
# Redémarrage immédiat des services pour prise en compte du nouveau groupe
for unit in "${active_services[@]}"; do
if systemctl restart "$unit"; then
msg_success "Service $unit redémarré avec succès."
else
msg_error "Impossible de redémarrer $unit."
fi
done
# ==================================================================
# [6/6] PLANIFICATION & GÉNÉRATION PFX
# ==================================================================
msg_warning "[6/6] Activation du renouvellement automatique..."
local CERT_CRT="/etc/ssl/wildcard/server.crt"
local CERT_KEY="/etc/ssl/wildcard/server.key"
local CERT_PFX="/etc/ssl/wildcard/server.pfx"
# Détection du groupe actuel du dossier (normalement ssl-cert)
local current_group
current_group="$(stat -c '%G' "$cert_dir")"
# DYNAMIQUE : On détecte 'ssl-cert' car on l'a appliqué au dossier juste au-dessus
local CURRENT_GROUP=$(stat -c '%G' /etc/ssl/wildcard/)
# 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
# La commande de génération PFX qui préserve les droits
local PFX_CMD="openssl pkcs12 -export -out $CERT_PFX -inkey $CERT_KEY -in $CERT_CRT -passout pass: -legacy && chown root:$CURRENT_GROUP $CERT_PFX && chmod 640 $CERT_PFX"
local STEP_BIN=$(which step)
local RENEW_CMD="$STEP_BIN certificate renew $CERT_CRT $CERT_KEY --force"
# ------------------------------------------------------------------
# Commande de renouvellement
# ------------------------------------------------------------------
local renew_cmd
renew_cmd="$step_bin certificate renew \"$cert_crt\" \"$cert_key\" --force"
# Récupération des services à redémarrer
local RESTART_CMD=""
for SVC in $CONFIG_DEB_INSTALL_DEFAULT_CA_SERVICES; do
if systemctl is-active --quiet "$SVC"; then
RESTART_CMD="$RESTART_CMD $SVC"
fi
done
# ------------------------------------------------------------------
# Commande de génération du PFX
# IMPORTANT:
# - -legacy pour compatibilité maximale avec Jellyfin/.NET
# - -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"
# Construction de la commande Cron
local FULL_COMMAND="$RENEW_CMD >> /var/log/cert-renew.log 2>&1 && $PFX_CMD"
[ -n "$RESTART_CMD" ] && FULL_COMMAND="$FULL_COMMAND && systemctl restart $RESTART_CMD"
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\" \
-passout pass: \
-legacy \
&& chown root:\"$current_group\" \"$cert_pfx\" \
&& chmod 640 \"$cert_pfx\""
# ------------------------------------------------------------------
# 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
fi
# ------------------------------------------------------------------
# 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\" \
&& chmod 640 \"$cert_key\" \
&& chmod 644 \"$cert_crt\""
if [[ -n "$restart_cmd" ]]; then
full_command+=" && $restart_cmd"
fi
# ------------------------------------------------------------------
# Installation du cron
# ------------------------------------------------------------------
local marker="# $CONFIG_DEB_INSTALL_DEFAULT_CA_CRON"
# Injection Crontab
local MARKER="# $CONFIG_DEB_INSTALL_DEFAULT_CA_CRON"
(
crontab -l 2>/dev/null | sed "/$MARKER/,/$MARKER/d"
echo "$MARKER"
echo "0 0 1 * * $FULL_COMMAND"
echo "$MARKER"
crontab -l 2>/dev/null | sed "/^${marker//\//\\/}$/,/^${marker//\//\\/}$/d"
echo "$marker"
echo "0 0 1 * * $full_command"
echo "$marker"
) | crontab -
# EXECUTION IMMÉDIATE : On génère le PFX et on fixe les droits des fichiers existants
eval $PFX_CMD
chown root:$CURRENT_GROUP $CERT_KEY $CERT_CRT
chmod 640 $CERT_KEY
chmod 644 $CERT_CRT
msg_success "Tâche cron installée avec succès."
# CRITIQUE : Redémarrage final pour que l'app prenne en compte son nouveau groupe
for SVC in $CONFIG_DEB_INSTALL_DEFAULT_CA_SERVICES; do
[ -n "$RESTART_CMD" ] && systemctl restart $SVC
# ------------------------------------------------------------------
# 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
# ------------------------------------------------------------------
# Redémarrage final (sécurité)
# ------------------------------------------------------------------
for unit in "${active_services[@]}"; do
if systemctl restart "$unit"; then
msg_success "Service $unit redémarré avec succès."
else
msg_error "Impossible de redémarrer $unit."
fi
done
msg_success "Infrastructure PKI prête. Groupe : $CURRENT_GROUP"