Internet-Draft | Secondary Clients Certificates | May 2025 |
Rosomakho & Hoyland | Expires 17 November 2025 | [Page] |
This document defines a mechanism for HTTP/2 and HTTP/3 clients to provide additional certificate-based credentials after the TLS handshake has completed, using TLS Exported Authenticators. Unlike traditional client authentication during the TLS handshake, this mechanism allows clients to present multiple certificates over the lifetime of a session.¶
This note is to be removed before publishing as an RFC.¶
The latest revision of this draft can be found at https://yaroslavros.github.io/httpbis-secondary-client-certs/draft-rosomakho-httpbis-secondary-client-certs.html. Status information for this document may be found at https://datatracker.ietf.org/doc/draft-rosomakho-httpbis-secondary-client-certs/.¶
Discussion of this document takes place on the HTTP mailing list (mailto:ietf-http-wg@w3.org), which is archived at https://lists.w3.org/Archives/Public/ietf-http-wg/.¶
Source for this draft and an issue tracker can be found at https://github.com/yaroslavros/httpbis-secondary-client-certs.¶
This Internet-Draft is submitted in full conformance with the provisions of BCP 78 and BCP 79.¶
Internet-Drafts are working documents of the Internet Engineering Task Force (IETF). Note that other groups may also distribute working documents as Internet-Drafts. The list of current Internet-Drafts is at https://datatracker.ietf.org/drafts/current/.¶
Internet-Drafts are draft documents valid for a maximum of six months and may be updated, replaced, or obsoleted by other documents at any time. It is inappropriate to use Internet-Drafts as reference material or to cite them other than as "work in progress."¶
This Internet-Draft will expire on 17 November 2025.¶
Copyright (c) 2025 IETF Trust and the persons identified as the document authors. All rights reserved.¶
This document is subject to BCP 78 and the IETF Trust's Legal Provisions Relating to IETF Documents (https://trustee.ietf.org/license-info) in effect on the date of publication of this document. Please review these documents carefully, as they describe your rights and restrictions with respect to this document. Code Components extracted from this document must include Revised BSD License text as described in Section 4.e of the Trust Legal Provisions and are provided without warranty as described in the Revised BSD License.¶
[TLS] provides an option for client authentication during the initial handshake, but this approach has several limitations. It requires early commitment to a single identity and can expose identifying information prematurely.¶
This document defines a protocol extension that allows [HTTP/2] and [HTTP/3] clients to provide certificate-based credentials after the TLS handshake, using TLS Exported Authenticators [EXPORTED-AUTH]. This enables clients to authenticate in a flexible and dynamic manner, for example when accessing specific resources, elevating privileges, or switching identities.¶
An important use case for this mechanism is the ability for a client to provide multiple identities or contextual information distributed across several certificates, such as separate device and user credentials.¶
This mechanism builds on and complements the secondary certificate support for HTTP servers defined in [SECONDARY-SERVER].¶
Client authentication using this mechanism can be initiated by either the client or the server:¶
A client-initiated authentication begins with the client sending an REQUEST_CLIENT_AUTH
frame. This signals its intent to provide certificate-based credentials and requests one or more challenge contexts from the server.¶
A server-initiated authentication begins with the server sending an AUTHENTICATOR_REQUESTS
frame unsolicited. This allows the server to request client credentials proactively.¶
In both cases, the server provides a set of authenticator request contexts using the AUTHENTICATOR_REQUESTS
frame. The client replies with one or more CERTIFICATE
frames, each containing an Exported Authenticator constructed using one of the received contexts.¶
The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", and "OPTIONAL" in this document are to be interpreted as described in BCP 14 [RFC2119] [RFC8174] when, and only when, they appear in all capitals, as shown here.¶
Support for HTTP-layer client certificate authentication is negotiated via a SETTINGS
parameter. An endpoint MUST NOT send frames related to client authentication (REQUEST_CLIENT_AUTH
, AUTHENTICATOR_REQUESTS
, or client-initiated CERTIFICATE
) unless the peer has explicitly advertised support via the SETTINGS
parameter defined in Section 3.1.¶
This restriction does not apply to server-initiated CERTIFICATE
frames, which are governed by [SECONDARY-SERVER].¶
A new SETTINGS
parameter is defined for both HTTP/2 and HTTP/3 to indicate support for HTTP-layer client certificate authentication. The value of this parameter MUST be either 0 or 1.¶
Each endpoint must advertise its own support. A client MUST NOT send REQUEST_CLIENT_AUTH
or CERTIFICATE
frames unless both parties have advertised support for this mechanism. Similarly, a server MUST NOT send an AUTHENTICATOR_REQUESTS
frame unless both parties have advertised support.¶
Endpoints MUST NOT send a SETTINGS_HTTP_CLIENT_CERT_AUTH
parameter with a value of 0 after previously sending a value of 1. Once support for this extension has been advertised, it is considered enabled for the lifetime of the connection.¶
In HTTP/2, this parameter is defined as an entry in the SETTINGS
frame as specified in Section 6.5.2 of [HTTP/2].¶
In HTTP/3, this parameter is defined as a SETTINGS
parameter in accordance with Section 7.2.4.1 of [HTTP/3].¶
When a client wishes to initiate HTTP-layer certificate authentication, it begins by sending an REQUEST_CLIENT_AUTH
frame. This frame signals the client's intent to provide one or more certificates and asks the server to generate a corresponding number of authenticator request contexts, which are returned in an AUTHENTICATOR_REQUESTS
frame.¶
A client MUST NOT send an REQUEST_CLIENT_AUTH
frame unless both endpoints have negotiated support for the HTTP-layer client certificate authentication mechanism via the SETTINGS_HTTP_CLIENT_CERT_AUTH
parameter as described in Section 3.1.¶
If a server receives an REQUEST_CLIENT_AUTH
frame and has not negotiated this extension, it MUST treat the event as a connection error. In HTTP/3, the connection MUST be closed with an H3_FRAME_UNEXPECTED
error according to Section 8 of [HTTP/3]. In HTTP/2, the connection MUST be closed with a PROTOCOL_ERROR
according to Section 5.4.1 of [HTTP/2].¶
The REQUEST_CLIENT_AUTH
frame is used by a client to request one or more authenticator request contexts from the server. This frame is only valid if both endpoints have negotiated support for HTTP-layer client certificate authentication.¶
This frame is used exclusively by clients and is considered a control frame. Its format and transport differ depending on the HTTP version in use.¶
The REQUEST_CLIENT_AUTH
frame is sent on stream 0.¶
REQUEST_CLIENT_AUTH Frame { Length (24), Type (8) = 0xTBD, Unused Flags (8), Reserved (1), Stream Identifier (31) = 0, Authenticator Count (i), }
The Authenticator Count
field is a variable-length integer that specifies how many authenticator request contexts the client is prepared to respond to. The value of this field MUST be greater than zero. Variable-length integers are encoded as described in Section 16 of [QUIC].¶
If the server receives an REQUEST_CLIENT_AUTH
frame with a Authenticator Count set to zero, it MUST treat it as a connection error of type PROTOCOL_ERROR
according to Section 5.4.1 of [HTTP/2].¶
If this frame is received on a stream other than stream 0, the recipient MUST treat it as a connection error of type PROTOCOL_ERROR
.¶
The REQUEST_CLIENT_AUTH
frame is sent on the control stream.¶
REQUEST_CLIENT_AUTH Frame { Length (i), Type (i) = 0xTBD, Authenticator Count (i), }
The Authenticator Count field is a variable-length integer that specifies how many authenticator request contexts the client is prepared to respond to. The value of this field MUST be greater than zero. Variable-length integers are encoded as described in Section 16 of [QUIC].¶
If the server receives an REQUEST_CLIENT_AUTH
frame with a Authenticator Count set to zero, it MUST treat it as a connection error of type H3_MESSAGE_ERROR
according to Section 8 of [HTTP/3].¶
If this frame is received on a stream other than the control stream, the recipient MUST treat it as a connection error of type H3_FRAME_UNEXPECTED
.¶
Upon receiving an REQUEST_CLIENT_AUTH
frame, the server MUST respond with an AUTHENTICATOR_REQUESTS
frame (as defined in Section 5.1). The AUTHENTICATOR_REQUESTS
frame carries a list of authenticator requests that the client is expected to satisfy. This list MAY be empty.¶
If the server is not prepared to generate any authenticator requests, or does not wish to accept client certificate authentication at this time, it MUST respond with an AUTHENTICATOR_REQUESTS
frame that contains an empty list of authenticators.¶
The server MAY include fewer authenticator requests than the number requested by the client. This allows the server to limit the state it must retain while waiting for the client to respond with corresponding CERTIFICATE
frames.¶
A client MUST NOT send a new REQUEST_CLIENT_AUTH
frame until all of the following conditions are met:¶
It has received an AUTHENTICATOR_REQUESTS
frame from the server in response to the previous request;¶
It has sent a CERTIFICATE
frame for each authenticator included in that response.¶
If the server receives an REQUEST_CLIENT_AUTH
frame that violates these conditions, such as being sent before the previous exchange has completed, it MUST treat this as a connection error. In HTTP/2, the server MUST terminate the connection with a PROTOCOL_ERROR
according to Section 5.4.1 of [HTTP/2]. In HTTP/3, it MUST terminate the connection with H3_FRAME_UNEXPECTED according to Section 8 of [HTTP/3].¶
The authentication procedure begins when the server sends an AUTHENTICATOR_REQUESTS
frame to the client. This may occur in response to a REQUEST_CLIENT_AUTH
frame previously sent by the client, or independently, if the server wishes to initiate client authentication based on its own policy.¶
The AUTHENTICATOR_REQUESTS
frame contains a list of authenticator requests, as defined in Section 4 of [EXPORTED-AUTH]. Each request presents a cryptographic challenge for the client to use in the construction of a corresponding Exported Authenticator. The list of authenticator requests MAY be empty, indicating that the server is not currently accepting client authentication but acknowledges the REQUEST_CLIENT_AUTH
request.¶
The client responds by sending a CERTIFICATE
frame for each authenticator request provided. Each CERTIFICATE
frame carries an Exported Authenticator that includes a certificate chain and proof of possession, as specified in Section 5 of [EXPORTED-AUTH]. A client may send an empty authenticator as defined in Section 6 of [EXPORTED-AUTH] in cases where it declines to authenticate for a given request.¶
This section defines the structure of the AUTHENTICATOR_REQUESTS
frame and outlines how it and the CERTIFICATE
frames, as defined in [SECONDARY-SERVER], are exchanged, ordered, and validated during the authentication process.¶
The AUTHENTICATOR_REQUESTS
frame is sent by the server to deliver authenticator requests to the client. It may be used in response to a REQUEST_CLIENT_AUTH
frame or sent independently. The list of authenticator requests MAY be empty, in which case the frame serves to acknowledge the client's request without initiating authentication.¶
Each authenticator request is used by the client to construct an Exported Authenticator as defined in Section 5 of [EXPORTED-AUTH]. This frame is sent only after support for HTTP-layer client certificate authentication has been negotiated via SETTINGS_HTTP_CLIENT_CERT_AUTH
as described in Section 3.1. It is a control frame and MUST be sent on stream 0 in HTTP/2 or the control stream in HTTP/3.¶
AUTHENTICATOR_REQUESTS Frame { Length (24), Type (8) = 0xTBD, Unused Flags (8), Reserved (1), Stream Identifier (31) = 0, Authenticator Request (..) ..., }
If this frame is received by a server on any stream, or by a client on a stream other than stream 0, the recipient MUST treat it as a connection error of type PROTOCOL_ERROR
according to Section 5.4.1 of [HTTP/2].¶
If the frame payload is malformed or contains malformed authenticator requests (e.g., incomplete length-prefixes or invalid encoding), the recipient MUST treat it as a connection error of type PROTOCOL_ERROR
.¶
AUTHENTICATOR_REQUESTS Frame { Type (i) = 0xTBD, Length (i), Authenticator Request (..) ..., }
If this frame is received by a server on any stream, or by a client on a stream other than the control stream, the recipient MUST treat it as a connection error of type H3_FRAME_UNEXPECTED
according to Section 8 of [HTTP/3].¶
If the frame payload is malformed or contains malformed authenticator requests, the recipient MUST treat it as a connection error of type H3_MESSAGE_ERROR
.¶
Each Authenticator Request is an encoded structure consisting of a variable-length integer length and the corresponding binary value of the request:¶
Authenticator Request { Length (i), ClientCertificateRequest (..), }
Length (i): A variable-length integer specifying the length, in bytes, of the ClientCertificateRequest.¶
ClientCertificateRequest: A structure as defined in Section 4 of [EXPORTED-AUTH].¶
The payload of the AUTHENTICATOR_REQUESTS
frame consists of a sequence of these Authenticator Request elements. The list MAY be empty. Clients parse the payload by reading the length, then interpreting the following bytes as a ClientCertificateRequest structure.¶
Clients MUST respond to each authenticator request context with a corresponding CERTIFICATE
frame, in the same order as the authenticator requests appeared in the AUTHENTICATOR_REQUESTS
frame.¶
A client MUST NOT accept a new AUTHENTICATOR_REQUESTS
frame while a previous one is still outstanding. Specifically, if the client has received an AUTHENTICATOR_REQUESTS
frame and has not yet sent a CERTIFICATE
frame for each contained request, it MUST treat any additional AUTHENTICATOR_REQUESTS
frame as a connection error.¶
In HTTP/2, the connection MUST be closed with a PROTOCOL_ERROR according to Section 5.4.1 of [HTTP/2]. In HTTP/3, the connection MUST be closed with H3_FRAME_UNEXPECTED
according to Section 8 of [HTTP/3].¶
The CERTIFICATE
frame is used by the client to respond to each authenticator request previously delivered by the server in an AUTHENTICATOR_REQUESTS
frame. Each CERTIFICATE
frame carries a single Exported Authenticator structure constructed using the TLS Exported Authenticator mechanism defined in Section 5.2 of [EXPORTED-AUTH].¶
The format and semantics of the CERTIFICATE
frame are defined in [SECONDARY-SERVER], and are reused without modification for client authentication.¶
Clients MUST send exactly one CERTIFICATE
frame for each authenticator request context received. These frames MUST be sent in the same order as the corresponding authenticator requests appeared in the AUTHENTICATOR_REQUESTS
frame.¶
A CERTIFICATE
frame MAY carry an empty authenticator, as described in Section 6 of [EXPORTED-AUTH]. This allows the client to decline authentication for a particular request context without terminating the connection.¶
Clients MUST NOT send CERTIFICATE
frames unless they are in response to an outstanding AUTHENTICATOR_REQUESTS
frame. If a server receives a CERTIFICATE
frame when no authenticator request is outstanding, it MUST treat this as a connection error.¶
Servers MUST NOT send CERTIFICATE
frames unless the secondary certificate authentication mechanism for HTTP servers has been negotiated according to [SECONDARY-SERVER]. If a client receives a server-generated CERTIFICATE
frame without such negotiation, it MUST treat this as a connection error of type PROTOCOL_ERROR
(HTTP/2) or H3_FRAME_UNEXPECTED
(HTTP/3).¶
This mechanism builds on TLS Exported Authenticators [EXPORTED-AUTH], which provide cryptographic binding to the underlying TLS connection and strong guarantees of authenticity, integrity, and freshness. However, several considerations remain relevant for implementers and deployers.¶
Servers MUST carefully validate client-provided certificates and ensure that they are trusted, appropriate for the context, and bound to the intended identity. Failure to enforce proper certificate validation could allow an attacker to impersonate another client or gain unauthorized access.¶
Authorization decisions based on certificates are application-specific and must be handled with care. A certificate's presence does not imply entitlement.¶
Exported Authenticators are constructed using unique per-session cryptographic context and include binding to the TLS connection via the handshake transcript. This provides replay protection across different sessions, provided the ClientCertificateRequest includes a fresh context value. Reuse of identical request contexts across connections SHOULD be avoided.¶
Certificates often contain long-lived identifiers (such as names, device serial numbers, or email addresses). When a client presents such certificates, it exposes identity information to the server. Clients should avoid presenting identifying certificates unless necessary for the resource or context being accessed.¶
If client authentication is not required, clients may prefer to respond with an empty Exported Authenticator.¶
Exported Authenticators are cryptographically bound to the TLS session in which they are sent. A certificate authenticated using this mechanism applies to the entire HTTP connection and all streams within it. Servers MUST NOT assume that certificate-based identity can vary between streams on the same connection.¶
Applications MUST ensure that any authenticated identity is scoped to the connection lifetime, and not reused across connections unless explicitly permitted by policy.¶
The process of generating authenticator requests, tracking their state, and verifying the resulting authenticators can be computationally expensive for the server. A malicious or misbehaving client could send repeated or excessive REQUEST_CLIENT_AUTH
frames to force the server to consume memory, perform cryptographic operations, or hold open authentication state.¶
Servers SHOULD apply limits on the number of authenticator requests they are willing to issue in response to a single request. Servers MAY respond with fewer AUTHENTICATOR_REQUESTS
than requested or with an empty list. Implementations SHOULD bound memory and compute usage per connection to mitigate such attacks.¶
Applications should consider the potential for timing side channels in certificate validation and authenticator generation. Variations in processing time may reveal information about internal policies, trust anchors, or user behavior. Constant-time validation and randomized delays are potential mitigations in sensitive deployments.¶
This document registers the REQUEST_CLIENT_AUTH
and AUTHENTICATOR_REQUESTS
frame types and SETTINGS_HTTP_CLIENT_CERT_AUTH
for both [HTTP/2] and [HTTP/3].¶
This specification registers the following entries in the "HTTP/2 Frame Types" registry defined in [HTTP/2]:¶
REQUEST_CLIENT_AUTH
frame:¶
AUTHENTICATOR_REQUESTS
frame:¶
This specification registers the following entries in the "HTTP/3 Frame Types" registry defined in [HTTP/3]:¶
REQUEST_CLIENT_AUTH
frame:¶
Value: 0xTBD¶
Frame Type: REQUEST_CLIENT_AUTH¶
Status: provisional (permanent if this document is approved)¶
Reference: This document¶
Change Controller: Yaroslav Rosomakho (IETF if this document is approved)¶
Contact: yrosomakho@zscaler.com (HTTP_WG; HTTP working group; ietf-http-wg@w3.org if this document is approved)¶
Notes: None¶
AUTHENTICATOR_REQUESTS
frame:¶
Value: 0xTBD¶
Frame Type: AUTHENTICATOR_REQUESTS¶
Status: provisional (permanent if this document is approved)¶
Reference: This document¶
Change Controller: Yaroslav Rosomakho (IETF if this document is approved)¶
Contact: yrosomakho@zscaler.com (HTTP_WG; HTTP working group; ietf-http-wg@w3.org if this document is approved)¶
Notes: None¶
This specification registers the following entry in the "HTTP/2 Settings" registry defined in [HTTP/2]:¶
This specification registers the following entry in the "HTTP/3 Settings" registry defined in [HTTP/3]:¶
Code: 0xTBD¶
Setting Name: SETTINGS_HTTP_CLIENT_CERT_AUTH¶
Default: 0¶
Status: provisional (permanent if this document is approved)¶
Reference: This document¶
Change Controller: Yaroslav Rosomakho (IETF if this document is approved)¶
Contact: yrosomakho@zscaler.com (HTTP_WG; HTTP working group; ietf-http-wg@w3.org if this document is approved)¶
Notes: None¶
TODO acknowledge.¶