From c8ccbb5e97232c3d432143edc51b0c85dc2302d5 Mon Sep 17 00:00:00 2001 From: Daniel Allaire Date: Sun, 5 Jul 2026 18:43:23 -0400 Subject: [PATCH] =?UTF-8?q?client=5Fpki=20:=20r=C3=A9-=C3=A9mettre=20le=20?= =?UTF-8?q?cert=20sur=20d=C3=A9rive=20de=20SAN=20(fin=20du=20rm=20manuel)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Le garde 'creates:' sautait la ré-émission même quand les SAN voulus changeaient (ex: nouvelle exposition -> client_pki_sans mis à jour). Contourné 3× à la main ce soir. Corrigé : on lit les SAN du cert existant (openssl) et on ré-émet si le cert est absent OU si un SAN voulu manque, puis on recharge les consommateurs (client_pki_reload_services). Idempotent (SAN à jour -> sauté) + dérive détectée, prouvés. ansible-lint production : 0. Co-Authored-By: Claude Opus 4.8 --- roles/client_pki/handlers/main.yml | 13 +++++++++++++ roles/client_pki/tasks/main.yml | 19 +++++++++++++++++-- 2 files changed, 30 insertions(+), 2 deletions(-) diff --git a/roles/client_pki/handlers/main.yml b/roles/client_pki/handlers/main.yml index aa64dd4..b4dce7a 100644 --- a/roles/client_pki/handlers/main.yml +++ b/roles/client_pki/handlers/main.yml @@ -3,3 +3,16 @@ ansible.builtin.systemd: daemon_reload: true listen: Recharger systemd + +# Apres une re-emission du cert (ex: nouveau SAN), recharger les services qui le +# servent (nginx, postfix, slapd...) sinon ils continuent de servir l'ancien cert. +- name: Recharger les consommateurs du cert + ansible.builtin.systemd: + name: "{{ item }}" + state: reloaded + loop: "{{ client_pki_reload_services }}" + loop_control: + label: "{{ item }}" + when: + - not ansible_check_mode + - client_pki_reload_services | length > 0 diff --git a/roles/client_pki/tasks/main.yml b/roles/client_pki/tasks/main.yml index 03cb698..5373efb 100644 --- a/roles/client_pki/tasks/main.yml +++ b/roles/client_pki/tasks/main.yml @@ -71,7 +71,16 @@ path: "{{ client_pki_steppath }}/certs/root_ca.crt" mode: "0644" -- name: Obtenir le certificat d'hote +- name: Lire les SAN du certificat d'hote existant (detection de derive) + ansible.builtin.command: + cmd: "openssl x509 -in {{ client_pki_cert }} -noout -ext subjectAltName" + register: client_pki_san_actuels + changed_when: false + failed_when: false + +# Re-emet si le cert est absent OU si un SAN voulu manque (ex: nouvelle exposition +# ajoutee au plan -> client_pki_sans mis a jour). Plus de garde 'creates' aveugle. +- name: Obtenir / re-emettre le certificat d'hote (absent ou SAN derives) ansible.builtin.command: cmd: >- step ca certificate {{ client_pki_nom_cert }} @@ -80,9 +89,15 @@ --provisioner-password-file {{ client_pki_steppath }}/provisioner.pass {% for s in client_pki_sans | select | unique %}--san {{ s }} {% endfor %} --force - creates: "{{ client_pki_cert }}" environment: STEPPATH: "{{ client_pki_steppath }}" + when: >- + client_pki_san_actuels.rc != 0 + or (client_pki_sans | select | unique | reject('equalto', '') + | reject('in', client_pki_san_actuels.stdout | default('')) + | list | length > 0) + changed_when: true + notify: Recharger les consommateurs du cert - name: Deployer l'unite systemd de renouvellement ansible.builtin.template: