While X.509 forbids end-entity certificates from being used as issuers for other certificates, it is valid to use them to issue other signed objects as long as the certificate contains the digitalSignature KeyUsage (
RFC 5280,
Section 4.2.1.3). (All certificates compatible with TLS 1.3 are required to contain the digitalSignature KeyUsage.) This document defines a new signed object format that encodes only the semantics that are needed for this application. The Credential has the following structure:
struct {
uint32 valid_time;
SignatureScheme dc_cert_verify_algorithm;
opaque ASN1_subjectPublicKeyInfo<1..2^24-1>;
} Credential;
-
valid_time:
-
Time, in seconds relative to the delegation certificate's notBefore value, after which the delegated credential is no longer valid. By default, unless set to an alternative value by an application profile (see Section 3), endpoints will reject delegated credentials that expire more than 7 days from the current time (as described in Section 4.1.3).
-
dc_cert_verify_algorithm:
-
The signature algorithm of the Credential key pair, where the type SignatureScheme is as defined in [RFC 8446]. This is expected to be the same as the sender's CertificateVerify.algorithm (as described in Section 4.1.3).
When using RSA, the public key MUST NOT use the rsaEncryption OID. As a result, the following algorithms are not allowed for use with delegated credentials: rsa_pss_rsae_sha256, rsa_pss_rsae_sha384, and rsa_pss_rsae_sha512.
-
ASN1_subjectPublicKeyInfo:
-
The Credential's public key, a DER-encoded [X.690] SubjectPublicKeyInfo as defined in [RFC 5280].
The DelegatedCredential has the following structure:
struct {
Credential cred;
SignatureScheme algorithm;
opaque signature<1..2^16-1>;
} DelegatedCredential;
-
cred:
-
The Credential structure as previously defined.
-
algorithm:
-
The signature algorithm used to create DelegatedCredential.signature.
-
signature:
-
The delegation, a signature that binds the credential to the end-entity certificate's public key as specified below. The signature scheme is specified by DelegatedCredential.algorithm.
The signature of the DelegatedCredential is computed over the concatenation of:
-
An octet stream that consists of octet 32 (0x20) repeated 64 times.
-
The non-null terminated context string "TLS, server delegated credentials" for server authentication and "TLS, client delegated credentials" for client authentication.
-
A single octet 0x00, which serves as the separator.
-
The DER-encoded X.509 end-entity certificate used to sign the DelegatedCredential.
-
DelegatedCredential.cred.
-
DelegatedCredential.algorithm.
The signature is computed by using the private key of the peer's end-entity certificate, with the algorithm indicated by DelegatedCredential.algorithm.
The signature effectively binds the credential to the parameters of the handshake in which it is used. In particular, it ensures that credentials are only used with the certificate and signature algorithm chosen by the delegator.
The code changes required in order to create and verify delegated credentials, and the implementation complexity this entails, are localized to the (D)TLS stack. This has the advantage of avoiding changes to the often-delicate security-critical PKI code.
This document defines the following (D)TLS extension code point.
enum {
...
delegated_credential(34),
(65535)
} ExtensionType;
A client that is willing to use delegated credentials in a connection
SHALL send a "delegated_credential" extension in its ClientHello. The body of the extension consists of a SignatureSchemeList (defined in [
RFC 8446]):
struct {
SignatureScheme supported_signature_algorithms<2..2^16-2>;
} SignatureSchemeList;
If the client receives a delegated credential without having indicated support in its ClientHello, then the client
MUST abort the handshake with an "unexpected_message" alert.
If the extension is present, the server
MAY send a delegated credential; if the extension is not present, the server
MUST NOT send a delegated credential. When a (D)TLS version negotiated is less than 1.3, the server
MUST ignore this extension. An example of when a server could choose not to send a delegated credential is when the SignatureSchemes listed only contain signature schemes for which a corresponding delegated credential does not exist or are otherwise unsuitable for the connection.
The server
MUST send the delegated credential as an extension in the CertificateEntry of its end-entity certificate; the client
MUST NOT use delegated credentials sent as extensions to any other certificate, and
SHOULD ignore them, but
MAY abort the handshake with an "illegal_parameter" alert. If the server sends multiple delegated credentials extensions in a single CertificateEntry, the client
MUST abort the handshake with an "illegal_parameter" alert.
The algorithm field
MUST be of a type advertised by the client in the "signature_algorithms" extension of the ClientHello message, and the dc_cert_verify_algorithm field
MUST be of a type advertised by the client in the SignatureSchemeList; otherwise, the credential is considered not valid. Clients that receive non-valid delegated credentials
MUST terminate the connection with an "illegal_parameter" alert.
A server that supports this specification
SHALL send a "delegated_credential" extension in the CertificateRequest message when requesting client authentication. The body of the extension consists of a SignatureSchemeList. If the server receives a delegated credential without having indicated support in its CertificateRequest, then the server
MUST abort with an "unexpected_message" alert.
If the extension is present, the client
MAY send a delegated credential; if the extension is not present, the client
MUST NOT send a delegated credential. When a (D)TLS version negotiated is less than 1.3, the client
MUST ignore this extension.
The client
MUST send the delegated credential as an extension in the CertificateEntry of its end-entity certificate; the server
MUST NOT use delegated credentials sent as extensions to any other certificate, and
SHOULD ignore them, but
MAY abort the handshake with an "illegal_parameter" alert. If the client sends multiple delegated credentials extensions in a single CertificateEntry, the server
MUST abort the handshake with an "illegal_parameter" alert.
The algorithm field
MUST be of a type advertised by the server in the "signature_algorithms" extension of the CertificateRequest message, and the dc_cert_verify_algorithm field
MUST be of a type advertised by the server in the SignatureSchemeList; otherwise, the credential is considered not valid. Servers that receive non-valid delegated credentials
MUST terminate the connection with an "illegal_parameter" alert.
On receiving a delegated credential and certificate chain, the peer validates the certificate chain and matches the end-entity certificate to the peer's expected identity in the same way that it is done when delegated credentials are not in use. It then performs the following checks with expiry time set to the delegation certificate's notBefore value plus DelegatedCredential.cred.valid_time:
-
Verify that the current time is within the validity interval of the credential. This is done by asserting that the current time does not exceed the expiry time. (The start time of the credential is implicitly validated as part of certificate validation.)
-
Verify that the delegated credential's remaining validity period is no more than the maximum validity period. This is done by asserting that the expiry time does not exceed the current time plus the maximum validity period (7 days by default) and that the expiry time is less than the certificate's expiry_time.
-
Verify that dc_cert_verify_algorithm matches the scheme indicated in the peer's CertificateVerify message and that the algorithm is allowed for use with delegated credentials.
-
Verify that the end-entity certificate satisfies the conditions described in Section 4.2.
-
Use the public key in the peer's end-entity certificate to verify the signature of the credential using the algorithm indicated by DelegatedCredential.algorithm.
If one or more of these checks fail, then the delegated credential is deemed not valid. Clients and servers that receive non-valid delegated credentials
MUST terminate the connection with an "illegal_parameter" alert.
If successful, the participant receiving the Certificate message uses the public key in DelegatedCredential.cred to verify the signature in the peer's CertificateVerify message.
This document defines a new X.509 extension, DelegationUsage, to be used in the certificate when the certificate permits the usage of delegated credentials. What follows is the ASN.1 [
X.680] for the DelegationUsage certificate extension.
ext-delegationUsage EXTENSION ::= {
SYNTAX DelegationUsage IDENTIFIED BY id-pe-delegationUsage
}
DelegationUsage ::= NULL
id-pe-delegationUsage OBJECT IDENTIFIER ::=
{ iso(1) identified-organization(3) dod(6) internet(1)
private(4) enterprise(1) id-cloudflare(44363) 44 }
The extension
MUST be marked non-critical. (See
Section 4.2 of
RFC 5280.) An endpoint
MUST NOT accept a delegated credential unless the peer's end-entity certificate satisfies the following criteria:
-
It has the DelegationUsage extension.
-
It has the digitalSignature KeyUsage (see the KeyUsage extension defined in [RFC 5280]).
A new extension was chosen instead of adding a new Extended Key Usage (EKU) to be compatible with deployed (D)TLS and PKI software stacks without requiring CAs to issue new intermediate certificates.