- No certificate, or one from an untrusted CA → denied. There is nothing else allowed by default.
- Certificates only. No password authentication, ever. A password mode needs something to check a secret against, and this design has nothing to give it. This is an exclusion, not a “not yet”.
- A bare public key is refused. There is no
authorized_keysand no per-user state to hold an exception in.
Certificate fields
Principals and accounts
An end-hop decides whether a principal may log in at all, and it does it the stock way. Then the OS decides whether that name is an account.
A login passes both or it does not log in. There is no default account and no fallback — falling back to the Sidecar’s own account would hand the session to whoever the process happens to be, and falling back to a fixed default would make the principals check decorative.
There is no
AuthorizedPrincipalsFile here. Under sshd that file is where a principal like alice@corp.example gets mapped onto the account devuser. These listeners have no such indirection, so principals must be literal login names. Carry the human identity in -I, or in a namespaced extension — see identity.
Missing principals
Omit-n and ssh-keygen signs a certificate valid for every login name. That is correct for a host certificate and a hole for a user certificate, and this is the one refusal that is not stock crypto/ssh behavior:
certificate carries no principals; a certificate valid for every login name cannot decide who may log in
ssh-keygen produces such a certificate whenever -n is left off, which makes this a plausible mistake rather than a theoretical one.
The client is told only
Permission denied (publickey). Naming the field that failed helps an attacker more than a user, so the reason goes to the operator’s log. Every handshake refusal on this page works that way.Extensions and critical options
Same certificate, same CA, one field moved from one bucket to the other, and the answer inverts:
That is the certificate format’s own rule, and both halves matter.
Supported critical options
valid-before / valid-after (-V) are checked at the handshake, both ends of the window, so host clocks must be in sync.
Grants
Two extensions decide what the holder may ask for:
Both are checked against the lane’s own settings. A grant is permission to ask;
capabilities_allowed and destinations_allowed decide what is carried. Either side missing refuses the request:
Destinations
A certificate names no destinations, and nothing about it should. Where a connection may be forwarded is the client’s decision to make and the listener’s to permit. A certificate has no standard field for a destination, and inventing one would put network topology into a short-lived credential — adding a host would mean reissuing certificates. The destination comes from the client’s own request, and the listener’sdestinations_allowed decides whether it is carried.
Revocation
There is none. The serial (-z) is recorded in the audit trail but never checked; no KRL and no RevokedKeys file is loaded.
Issuance checklist
Read a certificate back at any point:
Next
Host Configuration
The other half of a successful login: what
/etc/passwd and /etc/group must already say.Configuration
trusted_ca, and the identity mapping that turns certificate fields into a policy context.