- 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_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='[

Binary file not shown.

View File

@ -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 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."
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 " "
}