Ordinary TLS authenticates one side: the server presents a certificate, the client checks it, and the client stays at the TLS layer. Mutual TLS adds the other direction. The server asks the client for a certificate as well, and the connection is established only when each side has decided, independently and by its own policy, whether to trust what the other presented. The phrase "two identities, two policies" is the whole design: there are two certificates, two sets of trust anchors, two verification decisions, and then a third decision that TLS does not make at all.
How the server asks
In TLS 1.3, a server that authenticates with a certificate may also request one from the client. It does so with a CertificateRequest message, sent after EncryptedExtensions, which must list the signature algorithms the server accepts and may carry a certificate_authorities extension naming the certificate authorities, trust anchors or intermediate CAs, the client's certificate should chain to (RFC 9846, sections 4.4.2 and 4.3.4). That list guides the client's choice when it holds several certificates; it is not itself a trust decision. The client answers with its Certificate message and a CertificateVerify that proves it holds the private key (RFC 9846, section 4.5).
What the server may do when it does not like the answer
The protocol leaves the outcome to the server. If the client sends an empty Certificate message, the server may continue the handshake without client authentication or abort with a certificate_required alert; if the chain is unacceptable, for example not signed by a trusted , the server may either continue and treat the client as unauthenticated, or abort (RFC 9846, section 4.5.1.3). That is why products expose a choice between requesting and requiring a client certificate, as BIG-IP's peer-cert-mode does, and why "the handshake completed" is not evidence that the client was authenticated: in the permissive mode it completes either way, and the application has to check the result.
What "acceptable" means is ordinary certificate path validation, the same steps described in how certificate validation works, run by the server against its own trust anchors. One check is specific to this direction: a certificate restricted by the extended key usage extension has to permit client authentication, id-kp-clientAuth, to be used for it (RFC 5280, section 4.2.1.12).
Asking later is ruled out on HTTP/2 and HTTP/3
TLS 1.3 also defines post-handshake authentication: a client that offered it can be asked for a certificate at any time after the handshake (RFC 9846, section 4.7.2). It looks like the natural way to require a certificate only for one part of a site. The two multiplexed versions of HTTP forbid it: servers must not send post-handshake CertificateRequest messages, even when the client offered post-handshake authentication (RFC 9113, section 9.2.3), and QUIC servers must not use post-handshake client authentication at all, because with many requests multiplexed on one connection the client cannot tell which request the certificate request belongs to (RFC 9001, section 4.4). Over those versions, then, the decision to ask for a client certificate is made when the connection is set up, so a service that needs client certificates on only some of its paths has to separate them at that level, for example by giving them their own host name.
Authenticated is not authorised
A client certificate that validates proves one thing: whoever is at the other end holds the private key of a certificate issued, directly or through intermediates, by a CA this server trusts for client authentication. It does not say what that client may do. Many certificates can chain to the same accepted CA, and an operation still needs a decision: which identity in the certificate the application uses (a subject name, a subject alternative name), which account or role that identity maps to, and whether that role may perform this request on this resource. A partner with a valid certificate and read permission is still refused a write. Keeping those two steps separate in design and in logs is what makes an access failure readable: "the handshake failed" is a trust-anchor or certificate problem, while "the request was refused" is a mapping or permission problem.
Where termination moves the decision
Mutual TLS authenticates the endpoint that terminates TLS. When a reverse proxy offloads or re-encrypts the session, the proxy is the server that validated the client certificate, and the backend sees a different connection; whatever the backend learns about the client then comes from the proxy, not from the client's handshake. The trade-offs of offload, bridging and passthrough for client certificates are covered in inbound TLS at the reverse proxy.
Sources
- RFC 9846, The Transport Layer Security (TLS) Protocol Version 1.3, July 2026: section 4.3.4 (certificate_authorities), section 4.4.2 (CertificateRequest), section 4.5 (authentication messages), section 4.5.1.3 (an empty or unacceptable client certificate: continue or abort, at the server's discretion) and section 4.7.2 (post-handshake authentication) (read 2026-10-26)
- RFC 5280, Internet X.509 Public Key Infrastructure Certificate and Certificate Revocation List (CRL) Profile, May 2008: section 4.2.1.12, extended key usage and id-kp-clientAuth (read 2026-10-26)
- RFC 9113, HTTP/2, June 2022: section 9.2.3, HTTP/2 servers MUST NOT send post-handshake TLS 1.3 CertificateRequest messages, even if the client offered post_handshake_auth (read 2026-10-26)
- RFC 9001, Using TLS to Secure QUIC, May 2021: section 4.4, servers MUST NOT use post-handshake client authentication (read 2026-10-26)