Repository navigation
docs(adr): ADR-0050 and ADR-0051, RFC-0008's certificate-auth ADRs (Proposed) - #236
Conversation
…roposed) ADR-0050 accepts OpenSSH user certificates for Ed25519 keys, signed by a CA listed in the new `[auth] trusted_user_ca_keys` key that RFC-0010 reserves. `cert-authority` in authorized_keys stays refused (ADR-0040). The first cut honours no critical options. The CA is Ed25519 until the RFC-0012 implementation, which switches it to ssh-mldsa44-ed25519 only, so 0.1.0 ships with the composite CA. `permit-pty` feeds the ADR-0038 §3 gate, and server-sig-algs does not change. ADR-0051 names the audit fields RFC-0014 leaves to this lane: cert_key_id, cert_serial (a decimal string), cert_ca_fingerprint and cert_principal, all four or none, on auth.succeeded and exec.*. Both stay Proposed and flip to Accepted in the implementing PR. Refs #41, #109 Claude-Session: https://claude.ai/code/session_01QpBZ4qDMPzZWerWPccRsSG Signed-off-by: Gonzalo Fleming <gonzafg2@gmail.com>
Codex Review SummaryThis comment shows the latest Codex review activity on this pull request.
ℹ️ About Codex in GitHubYour team has set up Codex to review pull requests in this repo. Reviews are triggered when you
Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings. |
|
@codex review |
|
Codex Review: Didn't find any major issues. 👍 Reviewed commit: ℹ️ About Codex in GitHubYour team has set up Codex to review pull requests in this repo. Reviews are triggered when you
If Codex has suggestions, it will comment; otherwise it will react with 👍. Codex can also answer questions or update the PR. Try commenting "@codex address that feedback". |
PR Review: ADR-0050 and ADR-0051, RFC-0008's certificate-auth ADRs (Proposed) (#236)Decision: 🔴 Blocked Executive summaryThis PR adds two Proposed implementing ADRs for RFC-0008 (Accepted): ADR-0050 specifies how the server accepts OpenSSH user certificates, and ADR-0051 specifies four new audit log fields for certificate sessions. Both documents are well-structured and mostly correct: the type-state machine integrity is preserved ( Previous issuesCodex reviewed commit New findings🔴 Blocking (resolve before merge)
🟡 Important (should be resolved)
|
…nds itself in accepted documents Review on #236: - §2 and §3 rest on ADR-0021 and ADR-0029; RFC-0015 and RFC-0016 are cited as Drafts. - §7 and a Negative consequence state that, under ADR-0016, the principal match fixes the login name but not access: until Phase 3 every certificate a trusted CA issued gets in, so the CA should be dedicated to the server. Alternative 4 is reworded to match. - §8 adds a third refusal: a certificate from a CA not in trusted_user_ca_keys. - The maximum-lifetime setting is left to a later ADR, like the other deferrals. Claude-Session: https://claude.ai/code/session_01QpBZ4qDMPzZWerWPccRsSG Signed-off-by: Gonzalo Fleming <gonzafg2@gmail.com>
…0 §8) Follows the #236 review: the gate now covers check 2, the CA trust anchor, with a certificate that a second, untrusted CA signs. The operator guide and threat model §6.3 state that, until Phase 3, the CA file is the access boundary, and recommend a CA dedicated to the server. Claude-Session: https://claude.ai/code/session_01QpBZ4qDMPzZWerWPccRsSG Signed-off-by: Gonzalo Fleming <gonzafg2@gmail.com>
|
@codex review |
|
Codex Review: Didn't find any major issues. Keep it up! Reviewed commit: ℹ️ About Codex in GitHubYour team has set up Codex to review pull requests in this repo. Reviews are triggered when you
If Codex has suggestions, it will comment; otherwise it will react with 👍. Codex can also answer questions or update the PR. Try commenting "@codex address that feedback". |
|
/oc |
PR Review: ADR-0050 and ADR-0051, RFC-0008's certificate-auth ADRs (Proposed) (#236)Decision: 🟡 Minor changes Executive summaryThis PR adds two Proposed ADRs implementing RFC-0008 (certificate authentication) and RFC-0014 §5–§6 (the certificate audit fields), plus a governance-banner update in the Phase-2 plan. The design is conservative and mostly sound: CA trust before signature work, bounded pre-auth parsing (16 KiB blob, 256 principals, ≥16-byte nonce), fail-closed critical options, type-state preserved ( Previous issuesThe previous workflow review was claude[bot] Review #2 on
New findings🟡 Important (should be resolved)docs/adr/0050-accept-openssh-user-certificates.md:122-123 — composite-CA verification invariant missing (confidence: 84)
opencode v2.2.3 · |
|
Thanks. The invariant is right, and the code follows it. ADR-0050 is not edited, because the rule is already normative where ADR-0050 §4 points: RFC-0006 §"The verification invariant" and RFC-0012 §Reference-level ("a composite signature is valid only if both component signatures verify"). #242 implements the composite CA (478c98a):
|
What
RFC-0008 (Accepted 2026-07-01) adopts certificate authentication in Phase 2 and leaves its specifics to implementing ADRs. Until now no ADR or code existed for it. This PR adds two, both Proposed:
ssh-ed25519-cert-v01@openssh.com), signed by a CA listed in a new optional[auth] trusted_user_ca_keysfile.cert-authorityinauthorized_keys, which ADR-0040 keeps refusing (Alternative 1).ssh-ed25519for now, as RFC-0008's interim. The RFC-0012 implementation PR switches it tossh-mldsa44-ed25519only, so0.1.0ships with the composite CA.Expect<UserAuth>, with explicit bounds (16 KiB blob, 256 principals, nonce of at least 16 bytes): trusted CA before signature work, user role, validity window, exact principal match against the requested user name, and no critical options.source-addressandforce-commandcan follow in their own ADRs.permit-ptyfeeds the ADR-0038 §3 gate. The rest are ignored.cert_key_id,cert_serial(a decimal string),cert_ca_fingerprintandcert_principalappear onauth.succeeded,exec.startedandexec.finished, all four or none.authenticated_identityandauth.faileddo not change, andschema_versionstays1.docs/plans/phase2-scoping.mdpoints its certificate row and banner at the two ADRs.Why Proposed
As with ADR-0028/0029 and ADR-0047/0048, both flip to
Acceptedin the implementing PR, which carries the code, the config key, the interop checks and the docs.Evidence (2026-10-30)
draft-ietf-sshm-certis at-01(2026-06-15). §2.1.4 namesssh-ed25519-certas equivalent to the vendor name. OpenSSHV_10_6_P1registers onlyssh-ed25519-cert-v01@openssh.com(ssh-ed25519.c:302).server-sig-algsdoes not change. sshd builds it withsshkey_alg_list(0, 1, 1, ',')(kex.c:332), whoseplain_onlyargument drops certificate types. RFC-0015 (docs(rfc): RFC-0015 — negotiation profile version 1, the KEXINIT contract 0.1.0 freezes #223) is unaffected.AuthorizedPrincipalsFile: an exact match of the user name (auth2-pubkey.c:599,sshkey_cert_check_authority). The validity window issshkey.c:2454-2461, andSSHKEY_CERT_MAX_PRINCIPALSis 256 (sshkey.h:96).sshkey_type_is_valid_caaccepts every non-certificate type,mldsa44-ed25519included, sossh-keygen10.6 can sign with a composite CA.Decisions taken by the lead
0.1.0, rather than keeping Ed25519 next to it (ADR-0050 Alternative 3).Not in this PR
trusted_user_ca_keyskey, the interop checks, the threat model §5.3.2/§6.3 and operator-guide updates, and the Status flips.Refs #41, #109
https://claude.ai/code/session_01QpBZ4qDMPzZWerWPccRsSG