The authenticator is a structured message that can be exported from either party of a (D)TLS connection. It can be transmitted to the other party of the (D)TLS connection at the application layer. The application-layer protocol used to send the authenticator
SHOULD use a secure transport channel with equivalent security to TLS, such as QUIC [
RFC 9001], as its underlying transport to keep the authenticator confidential. The application
MAY use the existing (D)TLS connection to transport the authenticator.
An authenticator message can be constructed by either the client or the server given an established (D)TLS connection; an identity, such as an X.509 certificate; and a corresponding private key. Clients
MUST NOT send an authenticator without a preceding authenticator request; for servers, an authenticator request is optional. For authenticators that do not correspond to authenticator requests, the certificate_request_context is chosen by the server.
Each authenticator is computed using a Handshake Context and Finished MAC (Message Authentication Code) Key derived from the (D)TLS connection. These values are derived using an exporter as described in
Section 4 of
RFC 5705 (for (D)TLS 1.2) or
Section 7.5 of
RFC 8446 (for (D)TLS 1.3). For (D)TLS 1.3, the exporter_master_secret
MUST be used, not the early_exporter_master_secret. These values use different labels depending on the role of the sender:
-
The Handshake Context is an exporter value that is derived using the label "EXPORTER-client authenticator handshake context" or "EXPORTER-server authenticator handshake context" for authenticators sent by the client or server, respectively.
-
The Finished MAC Key is an exporter value derived using the label "EXPORTER-client authenticator finished key" or "EXPORTER-server authenticator finished key" for authenticators sent by the client or server, respectively.
The context_value used for the exporter is empty (zero length) for all four values. There is no need to include additional context information at this stage because the application-supplied context is included in the authenticator itself. The length of the exported value is equal to the length of the output of the hash function associated with the selected ciphersuite (for TLS 1.3) or the hash function used for the pseudorandom function (PRF) (for (D)TLS 1.2). Exported Authenticators cannot be used with (D)TLS 1.2 ciphersuites that do not use the TLS PRF and with TLS 1.3 ciphersuites that do not have an associated hash function. This hash is referred to as the "authenticator hash".
To avoid key synchronization attacks, Exported Authenticators
MUST NOT be generated or accepted on (D)TLS 1.2 connections that did not negotiate the extended master secret extension [
RFC 7627].
An authenticator is formed from the concatenation of TLS 1.3 Certificate, CertificateVerify, and Finished messages [
RFC 8446]. These messages are encoded as TLS handshake messages, including length and type fields. They do not include any TLS record-layer framing and are not encrypted with a handshake or application-data key.
If the peer populating the certificate_request_context field in an authenticator's Certificate message has already created or correctly validated an authenticator with the same value, then no authenticator should be constructed. If there is no authenticator request, the extensions are chosen from those presented in the (D)TLS handshake's ClientHello. Only servers can provide an authenticator without a corresponding request.
ClientHello extensions are used to determine permissible extensions in the server's unsolicited Certificate message in order to follow the general model for extensions in (D)TLS in which extensions can only be included as part of a Certificate message if they were previously sent as part of a CertificateRequest message or ClientHello message. This ensures that the recipient will be able to process such extensions.
The Certificate message contains the identity to be used for authentication, such as the end-entity certificate and any supporting certificates in the chain. This structure is defined in
Section 4.4.2 of
RFC 8446.
The Certificate message contains an opaque string called "certificate_request_context", which is extracted from the authenticator request, if present. If no authenticator request is provided, the certificate_request_context can be chosen arbitrarily; however, it
MUST be unique within the scope of the connection and be unpredictable to the peer.
Certificates chosen in the Certificate message
MUST conform to the requirements of a Certificate message in the negotiated version of (D)TLS. In particular, the entries of certificate_list
MUST be valid for the signature algorithms indicated by the peer in the "signature_algorithms" and "signature_algorithms_cert" extensions, as described in
Section 4.2.3 of
RFC 8446 for (D)TLS 1.3 or in Sections
7.4.2 and
7.4.6 of [
RFC 5246] for (D)TLS 1.2.
In addition to "signature_algorithms" and "signature_algorithms_cert", the "server_name" [
RFC 6066], "certificate_authorities" (
Section 4.2.4 of
RFC 8446), and "oid_filters" (
Section 4.2.5 of
RFC 8446) extensions are used to guide certificate selection.
Only the X.509 certificate type defined in [
RFC 8446] is supported. Alternative certificate formats such as Raw Public Keys as described in [
RFC 7250] are not supported in this version of the specification and their use in this context has not yet been analyzed.
If an authenticator request was provided, the Certificate message
MUST contain only extensions present in the authenticator request. Otherwise, the Certificate message
MUST contain only extensions present in the (D)TLS ClientHello. Unrecognized extensions in the authenticator request
MUST be ignored.
This message is used to provide explicit proof that an endpoint possesses the private key corresponding to its identity. The format of this message is taken from TLS 1.3:
struct {
SignatureScheme algorithm;
opaque signature<0..2^16-1>;
} CertificateVerify;
The algorithm field specifies the signature algorithm used (see
Section 4.2.3 of
RFC 8446 for the definition of this field). The signature is a digital signature using that algorithm.
The signature scheme
MUST be a valid signature scheme for TLS 1.3. This excludes all RSASSA-PKCS1-v1_5 algorithms and combinations of Elliptic Curve Digital Signature Algorithm (ECDSA) and hash algorithms that are not supported in TLS 1.3.
If an authenticator request is present, the signature algorithm
MUST be chosen from one of the signature schemes present in the "signature_algorithms" extension of the authenticator request. Otherwise, with spontaneous server authentication, the signature algorithm used
MUST be chosen from the "signature_algorithms" sent by the peer in the ClientHello of the (D)TLS handshake. If there are no available signature algorithms, then no authenticator should be constructed.
The signature is computed using the chosen signature scheme over the concatenation of:
-
a string that consists of octet 32 (0x20) repeated 64 times,
-
the context string "Exported Authenticator" (which is not NUL-terminated),
-
a single 0 octet that serves as the separator, and
-
the hashed authenticator transcript.
The authenticator transcript is the hash of the concatenated Handshake Context, authenticator request (if present), and Certificate message:
Hash(Handshake Context || authenticator request || Certificate)
Where Hash is the authenticator hash defined in
Section 5.1. If the authenticator request is not present, it is omitted from this construction, i.e., it is zero-length.
If the party that generates the authenticator does so with a different connection than the party that is validating it, then the Handshake Context will not match, resulting in a CertificateVerify message that does not validate. This includes situations in which the application data is sent via TLS-terminating proxy. Given a failed CertificateVerify validation, it may be helpful for the application to confirm that both peers share the same connection using a value derived from the connection secrets (such as the Handshake Context) before taking a user-visible action.
An HMAC [
HMAC] over the hashed authenticator transcript is the concatenation of the Handshake Context, authenticator request (if present), Certificate, and CertificateVerify. The HMAC is computed using the authenticator hash, using the Finished MAC Key as a key.
Finished = HMAC(Finished MAC Key, Hash(Handshake Context ||
authenticator request || Certificate || CertificateVerify))
An endpoint constructs an authenticator by serializing the Certificate, CertificateVerify, and Finished as TLS handshake messages and concatenating the octets:
Certificate || CertificateVerify || Finished
An authenticator is valid if the CertificateVerify message is correctly constructed given the authenticator request (if used) and the Finished message matches the expected value. When validating an authenticator, constant-time comparisons
SHOULD be used for signature and MAC validation.