Skip to content

feat(ca-server,ra-console): scellement des journaux par la TSA maison (constat J-1) - #103

Merged
PhilippeVienne merged 1 commit into
devfrom
feat/journal-seal-ca-ra
Oct 20, 2026
Merged

PhilippeVienne merged 1 commit into
devfrom
feat/journal-seal-ca-ra

Conversation

@PhilippeVienne

Copy link
Copy Markdown
Contributor

Tranche J-c du plan P1 (PROGRESSION.md §0), empilée sur #102 (base feat/tsa-audit-cross-seal) : à rebrancher sur dev après sa fusion.

Ce que fait la PR

Les journaux de ca-server et de ra-console n'étaient chaînés que par hachage, sans clé. Les deux services font désormais horodater la tête de leur chaîne par tsa-server, en HTTP, comme n'importe quel client RFC 3161 (log.sealed, jeton conservé), puis par les TSA tierces (log.cross_sealed), et en déposent une copie hors site si S3 est configuré (log.replicated), à chaque intervalle (décision du 2026-10-13 : scellement par la TSA maison, par HTTP).

  • Nouveau crate oe-seal : la boucle de bin/tsa-server/src/seal.rs généralisée par un trait Stamper (AuthorityStamper en mémoire pour la TSU ; HttpStamper via oe_crosstsa::Client::attest, nouvelle méthode publique à une seule TSA avec erreur typée). JournalHealth/JournalReport passent dans oe-audit (réexportés par oe-httpapi, rien ne change pour tsa-server). Les sept tests de la boucle passent avec elle (la TSA maison y est jointe en HTTP, comme en production) ; tsa-server garde deux tests propres à sa TSU (jeton vérifié par openssl ts -verify, horloge non traçable).
  • ca-server et ra-console : OPENEIDAS_TSA_URL (vide = pas de scellement, avertissement au démarrage), OPENEIDAS_AUDIT_SEAL_INTERVAL (_SECONDS pour la console), OPENEIDAS_CROSS_TSA_URLS (absente : FreeTSA et DigiCert ; vide : désactivé), OPENEIDAS_CROSS_TSA_TIMEOUT. /healthz rend l'état sous journal et passe statut en degrade après trois passes en échec, sans 503 (sonde de vivacité ; les services restent utilisables). Testé dans bin/ca-server/tests/crl_publication.rs et bin/ra-console/tests/healthz.rs.
  • Compose : la CA scelle via http://tsa:8318/tsa ; la TSA démarre après la CA, la première passe échoue et est reprise au bout d'une minute (SEAL_RETRY). La CI pose déjà OPENEIDAS_CROSS_TSA_URLS="" : aucune TSA publique sollicitée.
  • Chart : ca.audit.sealInterval, raConsole.audit.sealIntervalSeconds, raConsole.crossTSA.urls (vide par défaut : la NetworkPolicy de la console n'ouvre les ports 80/443 que s'il est renseigné ; egress vers le pod TSA ajouté). La CA reprend tsa.crossTSA.urls.
  • Docs : tables de configuration de docs/CA.md et docs/RA-CONSOLE.md.

Hors périmètre (J-d) : la matrice (REQ-7.10-02 dit encore « ni scellés ni contresignés »), CONFORMITE-ETSI.md, ARCHITECTURE.md, CPS.md.

Vérifications

  • cargo fmt --check, cargo clippy --workspace --all-targets -- -D warnings : OK
  • cargo test --workspace : OK (sans PostgreSQL ; les tests gardés par OE_CASTORE_TEST_DSN s'ignorent)
  • cargo audit --ignore RUSTSEC-2023-0071 : 4 avis sur rustls 0.23.45 (RUSTSEC-2026-0346 à 0349), indépendants de cette PR et présents sur dev : PR chore(deps) séparée.
  • helm lint et helm template (avec ci/ra-console-values.yaml) : OK, variables et NetworkPolicy rendues comme attendu.

https://claude.ai/code/session_017unSVWTcYebxj2tHbtFFVV

… (constat J-1)

Les journaux de ca-server et de ra-console n'étaient chaînés que par
hachage, sans clé : une réécriture complète avec recalcul de la chaîne
restait indétectable. Les deux services font désormais horodater la
tête de leur chaîne par tsa-server, en HTTP, comme n'importe quel
client RFC 3161 (log.sealed, jeton conservé), puis par les TSA tierces
(log.cross_sealed), et en déposent une copie hors site si S3 est
configuré (log.replicated), à chaque intervalle.

- Nouveau crate oe-seal : la boucle de bin/tsa-server/src/seal.rs,
  généralisée par un trait Stamper (AuthorityStamper en mémoire pour la
  TSU, HttpStamper par oe_crosstsa::Client::attest pour les autres).
  JournalHealth/JournalReport passent dans oe-audit (réexportés par
  oe-httpapi). Les tests de la boucle passent avec elle ; tsa-server ne
  garde que ceux qui tiennent à sa TSU.
- ca-server et ra-console : OPENEIDAS_TSA_URL (vide = pas de scellement,
  avertissement au démarrage), OPENEIDAS_AUDIT_SEAL_INTERVAL
  (_SECONDS pour la console), OPENEIDAS_CROSS_TSA_URLS (absente :
  FreeTSA et DigiCert ; vide : désactivé). /healthz rend l'état sous
  `journal` et passe le statut en « degrade » après trois passes en
  échec, sans 503 : les services restent utilisables, la sonde ne les
  redémarre pas.
- Compose : la CA scelle via http://tsa:8318/tsa. Chart :
  ca.audit.sealInterval, raConsole.audit.sealIntervalSeconds,
  raConsole.crossTSA.urls (vide par défaut : la NetworkPolicy de la
  console n'ouvre les ports 80 et 443 que s'il est renseigné ; egress
  vers le pod TSA ajouté).

La matrice de conformité n'est pas touchée (tranche J-d).

Réf. #36 de l'audit (J-1), docs/AUDIT_2026_09_25.md.

Co-authored-by: Claude <noreply@anthropic.com>
@PhilippeVienne
PhilippeVienne force-pushed the feat/journal-seal-ca-ra branch from 5fe753a to 8623cfb Compare October 20, 2026 17:11
@PhilippeVienne
PhilippeVienne changed the base branch from feat/tsa-audit-cross-seal to dev October 20, 2026 17:11
@PhilippeVienne
PhilippeVienne merged commit b74d67f into dev Oct 20, 2026
2 checks passed
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