Skip to content

feat(ca): révocation de l'autorité émettrice et ARL de la racine (C-1) - #56

Merged
PhilippeVienne merged 1 commit into
devfrom
feat/authority-revocation-arl
Sep 30, 2026
Merged

PhilippeVienne merged 1 commit into
devfrom
feat/authority-revocation-arl

Conversation

@PhilippeVienne

Copy link
Copy Markdown
Contributor

Objet

Constat C-1 de l'audit du 2026-09-25 (EN 319 411-1 CSS-6.3.9-12/-13, CSS-6.3.10-01) : rien ne permettait de révoquer une autorité, ni d'en informer les tiers. Base dev, indépendante des autres PR ouvertes.

  • oe-castore : migration 0007 (revoked_at/revocation_reason sur authorities, table arls et séquence arl_number_seq, même forme que crls) ; Store gagne revoke_authority (idempotente, première date et premier motif font foi), revoked_authorities, next_arl_number/save_arl/latest_arl. Réenregistrer une autorité n'efface jamais sa révocation (Memory aligné sur Postgres).
  • oe-ca-core : la cérémonie grave dans l'émettrice un CDP vers l'ARL de la racine et une AIA caIssuers vers son certificat. Nouveau module root (RootAuthority) : revoke_authority (journal ca.authority_revoked avant la mutation, refus de révoquer la racine, ARL republiée aussitôt) et publish_arl (publiée même vide). L'émettrice refuse d'émettre dès qu'elle est révoquée, relu à chaque émission : un serve déjà lancé s'arrête d'émettre sans redémarrage.
  • ca-server : authority revoke <nom> <motif> <opérateur> [commentaire] et authority publish-arl ouvrent le token de la racine, jamais pendant serve. ceremony publie l'ARL initiale s'il n'en existe pas (l'entrypoint relance la cérémonie à chaque démarrage, donc les déploiements existants en reçoivent une). serve sert /download/<CN racine>.cer et .arl (ARL relue en base à chaque requête). OPENEIDAS_ARL_VALIDITY : un an par défaut, refus au-delà. docs/CA.md à jour.

Limites assumées

  • Sans quorum (décision de l'utilisateur) : un seul opérateur nominatif, même discipline que la cérémonie.
  • Une émettrice cérémoniée avant cette version ne porte ni CDP ni AIA vers la racine (cérémonie idempotente) : seules les nouvelles hiérarchies en bénéficient.
  • La republication annuelle de l'ARL est manuelle (authority publish-arl) ; /healthz ne dégrade pas sur ARL périmée (la corriger exige la racine, qu'un redémarrage n'ouvre pas) : alerte à prévoir.
  • system_matrix() / docs/CONFORMITE-ETSI.md non modifiés, laissés à la tranche D-1/D-2.

Vérifications

  • cargo fmt --check, cargo clippy --workspace --all-targets -- -D warnings (1.97 et 1.98.1) : propres.
  • cargo test --workspace avec OE_CASTORE_TEST_DSN (PostgreSQL 17) : vert. cargo audit --ignore RUSTSEC-2023-0071 : vert.
  • Tiers indépendant : openssl verify -crl_check_all accepte une feuille avec une ARL vide, puis la rejette pour révocation dès que la racine a révoqué l'émettrice (la feuille elle-même n'est pas révoquée).
  • Mutation : sans ensure_not_revoked, a_revoked_issuing_authority_refuses_to_issue échoue ; sans la mise à jour en base, openssl_rejects_a_leaf_under_a_revoked_issuing_authority échoue ; sans la route de l'ARL, the_arl_is_served_where_the_issuing_cdp_points_and_reflects_revocation échoue. Journal avant mutation : a_journal_failure_blocks_authority_revocation_before_the_store_is_touched.
  • Chemins servis dérivés des URI réellement gravées dans le CDP/AIA de l'émettrice (bin/ca-server/tests/arl_publication.rs).

Revue humaine obligatoire

Voir PROVENANCE.md. Chaque case est cochée par le
contributeur humain qui valide la PR, après l'avoir fait lui-même.

  • Revue d'architecture validée par l'humain
  • Code relu et tests unitaires/intégration vérifiés localement
  • Absence de dépendances tierces incompatibles avec la double licence EUPL-1.2 / AGPL-3.0 (make licenses)
  • Validation de l'apport intellectuel et de la paternité humaine sur la modification

Assistance par IA

  • Cette PR a été produite avec l'assistance de Claude Code : les commits concernés portent la remorque Co-authored-by: Claude <noreply@anthropic.com>, auteur et committer restent humains, et scripts/provenance.py archive a été lancé
  • Cette PR a été écrite sans assistance par IA

Constat C-1 de l'audit du 2026-09-25 (EN 319 411-1 CSS-6.3.9-12/-13,
CSS-6.3.10-01) : rien ne permettait de révoquer une autorité, ni d'en
informer les tiers.

- oe-castore : migration 0007 (revoked_at/revocation_reason sur
  authorities, table arls et séquence arl_number_seq) ; Store gagne
  revoke_authority, revoked_authorities et le trio next/save/latest_arl.
  Réenregistrer une autorité n'efface jamais sa révocation.
- oe-ca-core : la cérémonie grave dans l'émettrice un CDP vers l'ARL de la
  racine et une AIA caIssuers vers son certificat. Nouveau module root
  (RootAuthority) : revoke_authority (journal avant la mutation, refus de
  révoquer la racine, ARL republiée aussitôt) et publish_arl. L'émettrice
  refuse d'émettre dès qu'elle est révoquée, relu à chaque émission.
- ca-server : `authority revoke` et `authority publish-arl` ouvrent le
  token de la racine, jamais pendant `serve` ; `ceremony` publie l'ARL
  initiale s'il n'y en a pas ; `serve` sert `/download/<CN racine>.cer` et
  `.arl` ; OPENEIDAS_ARL_VALIDITY (un an au plus).

Vérifié par openssl verify -crl_check_all : une feuille non révoquée est
rejetée dès que son émettrice l'est. Gardes testées par mutation.

Co-authored-by: Claude <noreply@anthropic.com>
@PhilippeVienne
PhilippeVienne force-pushed the feat/authority-revocation-arl branch from 70329df to b3f6389 Compare September 30, 2026 12:35
@PhilippeVienne
PhilippeVienne merged commit 1301fe8 into dev Sep 30, 2026
14 of 15 checks passed
@PhilippeVienne
PhilippeVienne deleted the feat/authority-revocation-arl branch September 30, 2026 12:49
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant