Repository navigation
feat(ra-console): connexion par nom, login/begin et login/finish (1c-1) - #34
Merged
Merged
Conversation
ra-console vérifie elle-même l'assertion WebAuthn contre le registre en
lecture seule (docs/WEBUI.md §15 étape 1c, §16) : aucun aller-retour vers
ca-server pour une connexion. Une session n'est jamais une ancre de
confiance (ca-server re-vérifie chaque action) ; cette tranche ne rend donc
que l'identité vérifiée, la session (cookie, /api/v1/me, déconnexion,
purge, débit) est 1c-2.
- POST /api/v1/webauthn/login/begin {name} : options WebAuthn de même forme
que le nom existe ou non ("connexion par nom, réponses uniformes"). Un
nom inconnu, désactivé ou sans clé active reçoit un défi factice à une
clé, dont l'identifiant dérive de HMAC-SHA256(secret du service, nom) —
stable pour un même nom, imprévisible sans le secret. oe-webauthn expose
ce constructeur (decoy_authentication_challenge), testé contre un défi
réel produit par le même vérificateur.
- POST /api/v1/webauthn/login/finish {challenge_id, credential} : consomme
le challenge dans webauthn_challenges (usage unique, 5 min), vérifie
l'assertion et met à jour login_counters, le compteur anti-clonage propre
à ra-console (jamais webauthn_credentials.sign_count, que ra-console ne
peut pas écrire). Une seule erreur pour tout refus après begin : nom
inconnu, leurre, challenge périmé/consommé, clé révoquée, opérateur
désactivé, signature refusée, compteur en régression ne se distinguent
jamais de l'extérieur.
- oe-actions::Registry::operator_by_name, en lecture seule.
- oe-actions et oe-webauthn passent de dev-dependencies à dependencies de
ra-console. oe-ca-core désactive les fonctionnalités par défaut de son
lien vers oe-hsm (elle n'utilise que le trait SigningToken) : sans ce
réglage, la dépendance transitive par oe-actions -> oe-raflow ->
oe-ca-core aurait relié cryptoki au binaire de ra-console (tests/no_pkcs11.rs
l'a détecté).
Vérifications : cargo fmt --check, cargo clippy --workspace --all-targets
(1.97 et 1.98.1), cargo test --workspace (avec OE_CASTORE_TEST_DSN), cargo
audit. Contrôle par mutation : le compteur anti-clonage, le contrôle de
révocation et le rejet d'une clé d'un autre opérateur échouent chacun pour
la bonne raison quand on retire le contrôle correspondant.
PhilippeVienne
changed the base branch from
fix/operators-load-without-hsm
to
dev
September 25, 2026 09:04
PhilippeVienne
force-pushed
the
feat/ra-console-login-begin-finish
branch
from
September 25, 2026 09:04
ab615f9 to
79b34b4
Compare
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Contexte
Étape 1c du plan WEBUI §15 (
ra-console), premier des deux morceaux convenus : la connexion.ra-consolevérifie elle-même l'assertion WebAuthn contre le registre en lecture seule — aucun aller-retour versca-serverpour une connexion, une session n'étant jamais une ancre de confiance (ca-serverre-vérifie chaque action, §16). Reste (1c-2, PR suivante) : sessions, cookie,/api/v1/me, déconnexion, purge, limitation de débit.Empilée sur #33 (
fix/operators-load-without-hsm).Contenu
POST /api/v1/webauthn/login/begin {name}: options WebAuthn de même forme que le nom existe ou non ("connexion par nom, réponses uniformes", §16). Un nom inconnu, désactivé ou sans clé active reçoit un défi factice à une clé, dont l'identifiant dérive deHMAC-SHA256(secret du service, nom).oe-webauthnexpose ce constructeur (decoy_authentication_challenge), testé contre un défi réel produit par le même vérificateur (même RP ID, délai,userVerification,hints, nombre de clés proposées).POST /api/v1/webauthn/login/finish {challenge_id, credential}: consomme le challenge danswebauthn_challenges(usage unique, 5 min), vérifie l'assertion et met à jourlogin_counters— le compteur anti-clonage propre àra-console, jamaiswebauthn_credentials.sign_countqu'elle ne peut pas écrire (rôle PostgreSQL en lecture seule, §16). Une seule erreur pour tout refus aprèsbegin: nom inconnu, leurre, challenge périmé/consommé, clé révoquée, opérateur désactivé, signature refusée, compteur en régression ne se distinguent jamais de l'extérieur.oe-actions::Registry::operator_by_name, en lecture seule.Un piège rencontré et son correctif
oe-actionsetoe-webauthnpassent dedev-dependenciesàdependenciesdera-console.oe-ca-coredésactive désormais les fonctionnalités par défaut de son lien versoe-hsm(elle n'utilise que le traitSigningToken, jamaisPkcs11Token) : sans ce réglage, la dépendance transitiveoe-actions → oe-raflow → oe-ca-core → oe-hsmaurait reliécryptokiau binaire dera-console, contrairement à docs/WEBUI.md §16.tests/no_pkcs11.rsl'a détecté immédiatement ;ca-server, qui redemandeoe-hsmdirectement avec ses fonctionnalités par défaut, n'est pas affecté.Limite assumée
Le défi factice ne propose toujours qu'une seule clé (le cas le plus courant d'un opérateur) : un opérateur qui en porterait plusieurs resterait distinguable par le nombre de clés proposées. Documenté dans le code (
oe_webauthn::decoy).Vérifications
cargo fmt --checkcargo clippy --workspace --all-targets -- -D warnings(toolchain 1.97 et 1.98.1, celle de la CI)cargo test --workspace(avecOE_CASTORE_TEST_DSN) : vert, y compris les nouveaux tests d'intégration de bout en bout (bin/ra-console/tests/login.rs) et les tests unitaires d'oe-webauthn(aller-retour JSON de l'état d'authentification, forme du défi factice)cargo audit --ignore RUSTSEC-2023-0071: rien à signaler