#!/bin/bash # GENERE par Set-OPS (role client_pki). Ne pas editer a la main. # # SONDE : le certificat d'hote tiendra-t-il jusqu'au prochain renouvellement ? # # Contrat (docs/supervision-conception.md) : une ligne sur la sortie standard, # 0 = OK, 1 = AVERTISSEMENT, 2 = CRITIQUE. Aucun acces reseau requis — c'est le porteur # (`client_sante`) qui pousse le resultat a Icinga. set -uo pipefail CERT="{{ client_pki_cert }}" RACINE="{{ client_pki_steppath }}/certs/root_ca.crt" AVERT={{ client_pki_sonde_avert_h }} CRIT={{ client_pki_sonde_crit_h }} [[ -r "${CERT}" ]] || { echo "Aucun certificat d'hote lisible en ${CERT}."; exit 2; } fin=$(openssl x509 -in "${CERT}" -noout -enddate 2>/dev/null | cut -d= -f2) [[ -n "${fin}" ]] || { echo "Certificat illisible : ${CERT}."; exit 2; } reste=$(( ( $(date -d "${fin}" +%s) - $(date +%s) ) / 3600 )) # LA CHAINE, PAS SEULEMENT LA DATE. Un certificat non expire mais signe par une autre # racine que la notre est une panne aussi complete qu'un certificat perime — et elle # arrive : une AC reconstruite emet des certificats parfaitement valides que plus # personne ne verifie. # # `step certificate verify`, PAS `openssl verify` — et la premiere version de cette sonde # a fait la faute (2026-09-09). Nos certificats d'hote sont signes par un INTERMEDIAIRE, # et seule la racine vit sur le disque : `openssl verify -CAfile racine` ne trouve pas le # maillon manquant et refuse. Resultat, 14 machines sur 14 en CRITIQUE — sur une PKI qui # se portait tres bien. `step` sait lire la chaine que step-ca ecrit dans le fichier. # # LA LECON N'EST PAS « prendre le bon outil » : c'est qu'une sonde doit etre eprouvee # contre un etat SAIN autant que contre un etat casse. Une alarme toujours allumee ne vaut # pas mieux qu'une alarme jamais allumee — elle apprend a ne plus regarder. if ! step certificate verify "${CERT}" --roots "${RACINE}" >/dev/null 2>&1; then echo "Le certificat d'hote ne se verifie PAS contre ${RACINE} (${reste} h restantes)." exit 2 fi {% if client_pki_reload_services %} # LE CERTIFICAT SERVI, PAS CELUI DU DISQUE (mesure du 2026-08). # # Un cert renouvele sur disque restait servi PERIME en memoire tant que le consommateur # n'etait pas recharge. Le fichier disait « tout va bien », le port disait le contraire — # et c'est le port que voient les autres machines. On compare donc les empreintes. disque=$(openssl x509 -in "${CERT}" -noout -fingerprint -sha256 2>/dev/null | cut -d= -f2) {% for service in client_pki_reload_services %} {% if client_pki_sonde_port %} servi=$(echo | timeout 6 openssl s_client -connect 127.0.0.1:{{ client_pki_sonde_port }} 2>/dev/null \ | openssl x509 -noout -fingerprint -sha256 2>/dev/null | cut -d= -f2) if [[ -n "${servi}" && "${servi}" != "${disque}" ]]; then echo "{{ service }} sert un certificat DIFFERENT de celui du disque : recharger le service (${reste} h restantes)." exit 2 fi {% endif %} {% endfor %} {% endif %} if (( reste <= CRIT )); then echo "Certificat d'hote : ${reste} h avant expiration — le renouvellement ne passe plus." exit 2 fi if (( reste <= AVERT )); then echo "Certificat d'hote : ${reste} h avant expiration (seuil ${AVERT} h)." exit 1 fi echo "Certificat d'hote valide ${reste} h, chaine verifiee."