This section presents the protocol flow. For completeness, we include the ACME profile proposed in this document as well as the ACME STAR protocol described in [
RFC 8739].
The protocol assumes the following preconditions are met:
-
The IdO exposes an ACME server interface to the NDC(s) comprising the account management interface.
-
The NDC has registered an ACME account with the IdO.
-
The NDC and IdO have agreed on a "CSR template" to use, including at a minimum: subject name (e.g., abc.ido.example), requested algorithms and key length, key usage, and extensions. The NDC will use this template for every CSR created under the same delegation.
-
The IdO has registered an ACME account with the Certification Authority (CA).
Note that even if the IdO implements the ACME server role, it is not acting as a CA; in fact, from the point of view of the certificate issuance process, the IdO only works as a "policing" forwarder of the NDC's key pair and is responsible for completing the identity verification process towards the CA.
For clarity, the protocol overview presented here covers the main use case of this protocol, namely delegation of STAR certificates. Protocol behavior for non-STAR certificates is similar, and the detailed differences are listed in the following sections.
The interaction between the NDC and the IdO is governed by the profiled ACME workflow detailed in
Section 2.3. The interaction between the IdO and the CA is ruled by ACME [
RFC 8555], ACME STAR [
RFC 8739], and any other ACME extension that applies (e.g., [
TOKEN-TNAUTHLIST] for Secure Telephone Identity Revisited (STIR)).
The outline of the combined protocol for STAR certificates is as follows (
Figure 1):
-
NDC sends an Order1 for the delegated identifier to IdO.
-
IdO creates an Order1 resource in state ready with a finalize URL.
-
NDC immediately sends a finalize request (which includes the CSR) to the IdO.
-
IdO verifies the CSR according to the agreed upon CSR template.
-
If the CSR verification fails, Order1 is moved to an invalid state and everything stops.
-
If the CSR verification is successful, IdO moves Order1 to state processing and sends a new Order2 (using its own account) for the delegated identifier to the CA.
-
If the ACME STAR protocol fails, Order2 moves to invalid, and the same state is reflected in Order1 (i.e., the NDC Order).
-
If the ACME STAR run is successful (i.e., Order2 is valid), IdO copies the star-certificate URL from Order2 to Order1 and updates the Order1 state to valid.
The NDC can now download, install, and use the short-term certificate bearing the name delegated by the IdO. The STAR certificate can be used until it expires, at which time the NDC is guaranteed to find a new certificate it can download, install, and use. This continues with subsequent certificates until either Order1 expires or the IdO decides to cancel the automatic renewal process with the CA.
Note that the interactive identifier authorization phase described in
Section 7.5 of
RFC 8555 is suppressed on the NDC-IdO side because the delegated identity contained in the CSR presented to the IdO is validated against the configured CSR template (
Section 4.1). Therefore, the NDC sends the
finalize request, including the CSR, to the IdO immediately after Order1 has been acknowledged. The IdO
SHALL buffer a (valid) CSR until the Validation phase completes successfully.
Also note that the successful negotiation of the unauthenticated GET (
Section 3.4 of
RFC 8739) is required in order to allow the NDC to access the
star-certificate URL on the CA.
.------. .---------------. .------.
| NDC | | IdO | | ACME |
+--------+ +--------+--------+ +--------+
| Client | | Server | Client | | Server |
'---+----' '----+---+---+----' '----+---'
| | | |
| Order1 | | |
| Signature | | |
o------------------->| | |
| | | |
| [ No identity ] | | |
| [ validation via ] | | |
| [ authorizations ] | | |
| | | |
| CSR | | |
| Signature | | |
o------------------->| | |
| Acknowledgement | | Order2 |
|<-------------------o | Signature |
| | o------------------->|
| | | Required |
| | | Authorizations |
| | |<-------------------o
| | | Responses |
| | | Signature |
| | o------------------->|
| | | |
| | |<~~~~Validation~~~~>|
| | | |
| | | CSR |
| | | Signature |
| | o------------------->|
| | | Acknowledgement |
| | |<-------------------o
| | | |
|<~~Await issuance~->| |<~~Await issuance~~>|
| |
| (unauthenticated) GET STAR certificate |
o------------------------------------------------>|
| Certificate #1 |
|<------------------------------------------------o
| (unauthenticated) GET STAR certificate |
o------------------------------------------------>|
| Certificate #2 |
|<------------------------------------------------o
| [...] |
| (unauthenticated) GET STAR certificate |
o------------------------------------------------>|
| Certificate #n |
|<------------------------------------------------o
This section defines a profile of the ACME protocol to be used between the NDC and IdO.
The IdO must be preconfigured to recognize one or more NDCs and present them with details about certificate delegations that apply to each one.
An NDC identifies itself to the IdO as an ACME account. The IdO can delegate multiple names to an NDC, and these configurations are described through
delegation objects associated with the NDC's account object on the IdO.
As shown in
Figure 2, the ACME account resource on the IdO is extended with a new
delegations attribute:
-
delegations (required, string):
-
A URL from which a list of delegationsconfigured for this account (Section 2.3.1.3) can be fetched via aPOST-as-GET request.
{
"status": "valid",
"contact": [
"mailto:delegation-admin@ido.example"
],
"termsOfServiceAgreed": true,
"orders": "https://example.com/acme/orders/saHpfB",
"delegations": "https://acme.ido.example/acme/delegations/adFqoz"
}
Each account object includes a
delegations URL from which a list of delegation configurations created by the IdO can be fetched via a POST-as-GET request. The result of the request
MUST be a JSON object whose
delegations field is an array of URLs, each identifying a delegation configuration made available to the NDC account (
Section 2.3.1.3). The server
MAY return an incomplete list, along with a
Link header field with a
next link relation indicating where further entries can be acquired.
HTTP/1.1 200 OK
Content-Type: application/json
Link: <https://acme.ido.example/acme/directory>;rel="index"
Link: <https://acme.ido.example/acme/delegations/adFqoz?/
cursor=2>;rel="next"
{
"delegations": [
"https://acme.ido.example/acme/delegation/ogfr8EcolOT",
"https://acme.ido.example/acme/delegation/wSi5Lbb61E4",
/* more URLs not shown for example brevity */
"https://acme.ido.example/acme/delegation/gm0wfLYHBen"
]
}
Note that in the figure above, https://acme.ido.example/acme/delegations/adFqoz?cursor=2 includes a line break for the sake of presentation.
This profile extends the ACME resource model with a new read-only
delegation object that represents a delegation configuration that applies to a given NDC.
A
delegation object contains the CSR template (see
Section 4) that applies to that delegation and, optionally, any related CNAME mapping for the delegated identifiers. Its structure is as follows:
-
csr-template (required, object):
-
CSR template, as defined inSection 4.
-
cname-map (optional, object):
-
A map of FQDN pairs. In each pair, the name isthe delegated identifier; the value is the corresponding NDC name that isaliased in the IdO's zone file to redirect the resolvers to the delegatedentity. Both names and values MUST be FQDNs with a terminating '.'.This field is only meaningful for identifiers of type dns.
An example
delegation object in JSON format is shown in
Figure 3.
{
"csr-template": {
"keyTypes": [
{
"PublicKeyType": "id-ecPublicKey",
"namedCurve": "secp256r1",
"SignatureType": "ecdsa-with-SHA256"
}
],
"subject": {
"country": "CA",
"stateOrProvince": "**",
"locality": "**"
},
"extensions": {
"subjectAltName": {
"DNS": [
"abc.ido.example"
]
},
"keyUsage": [
"digitalSignature"
],
"extendedKeyUsage": [
"serverAuth"
]
}
},
"cname-map": {
"abc.ido.example.": "abc.ndc.example."
}
}
In order to indicate which specific delegation applies to the requested certificate, a new
delegation attribute is added to the order object on the NDC-IdO side (see Figures [
4] and [
7]). The value of this attribute is the URL pointing to the delegation configuration object that is to be used for this certificate request. If the
delegation attribute in the order object contains a URL that does not correspond to a configuration available to the requesting ACME account, the IdO
MUST return an error response with status code 403 (Forbidden), providing a problem document [
RFC 7807] with type
urn:ietf:params:acme:error:unknownDelegation.
If the delegation is for a STAR certificate, the request object created by the NDC:
-
MUST have a delegation attribute indicating the preconfigured delegationthat applies to this Order;
-
MUST have entries in the identifiers field for each delegated namepresent in the configuration;
-
MUST NOT contain the notBefore and notAfter fields; and
-
MUST contain an auto-renewal object and, inside it, the fieldslisted in Section 3.1.1 of RFC 8739. In particular, theallow-certificate-get attribute MUST be present and set to true.
POST /acme/new-order HTTP/1.1
Host: acme.ido.example
Content-Type: application/jose+json
{
"protected": base64url({
"alg": "ES256",
"kid": "https://acme.ido.example/acme/acct/evOfKhNU60wg",
"nonce": "Alc00Ap6Rt7GMkEl3L1JX5",
"url": "https://acme.ido.example/acme/new-order"
}),
"payload": base64url({
"identifiers": [
{
"type": "dns",
"value": "abc.ido.example"
}
],
"auto-renewal": {
"end-date": "2021-04-20T00:00:00Z",
"lifetime": 345600, // 4 days
"allow-certificate-get": true
},
"delegation":
"https://acme.ido.example/acme/delegation/gm0wfLYHBen"
}),
"signature": "g454e3hdBlkT4AEw...nKePnUyZTjGtXZ6H"
}
The order object that is created on the IdO:
-
MUST start in the ready state;
-
MUST contain an authorizations array with zero elements;
-
MUST contain the indicated delegation configuration;
-
MUST contain the indicated auto-renewal settings; and
-
MUST NOT contain the notBefore and notAfter fields.
{
"status": "ready",
"expires": "2021-05-01T00:00:00Z",
"identifiers": [
{
"type": "dns",
"value": "abc.ido.example"
}
],
"auto-renewal": {
"end-date": "2021-04-20T00:00:00Z",
"lifetime": 345600,
"allow-certificate-get": true
},
"delegation":
"https://acme.ido.example/acme/delegation/gm0wfLYHBen",
"authorizations": [],
"finalize": "https://acme.ido.example/acme/order/TO8rfgo/finalize"
}
The Order is then finalized by the NDC supplying the CSR containing the delegated identifiers. The IdO checks the provided CSR against the template contained in the
delegation object that applies to this request, as described in
Section 4.1. If the CSR fails validation for any of the identifiers, the IdO
MUST return an error response with status code 403 (Forbidden) and an appropriate type, e.g.,
rejectedIdentifier or
badCSR. The error response
SHOULD contain subproblems (
Section 6.7.1 of
RFC 8555) for each failed identifier. If the CSR is successfully validated, the order object status moves to
processing and the twin ACME protocol instance is initiated on the IdO-CA side.
The request object created by the IdO:
-
MUST copy the identifiers sent by the NDC;
-
MUST strip the delegation attribute; and
-
MUST carry a copy of the auto-renewal object sent by the NDC.
When the identifiers' authorization has been successfully completed and the certificate has been issued by the CA, the IdO:
-
MUST move its Order resource status to valid and
-
MUST copy the star-certificate field from the STAR Order returned by the CAinto its Order resource. When dereferenced, the star-certificate URLincludes (via the Cert-Not-Before and Cert-Not-After HTTP header fields) the renewal timersneeded by the NDC to inform its certificate reload logic.
{
"status": "valid",
"expires": "2021-05-01T00:00:00Z",
"identifiers": [
{
"type": "dns",
"value": "abc.ido.example"
}
],
"auto-renewal": {
"end-date": "2021-04-20T00:00:00Z",
"lifetime": 345600,
"allow-certificate-get": true
},
"delegation":
"https://acme.ido.example/acme/delegation/gm0wfLYHBen",
"authorizations": [],
"finalize": "https://acme.ido.example/acme/order/TO8rfgo/finalize",
"star-certificate": "https://acme.ca.example/acme/order/yTr23sSDg9"
}
This delegation protocol is predicated on the NDC being able to fetch certificates periodically using an unauthenticated HTTP GET, since, in general, the NDC does not possess an account on the CA; as a consequence, it cannot issue the standard POST-as-GET ACME request. Therefore, before forwarding the Order request to the CA, the IdO
SHOULD ensure that the selected CA supports unauthenticated GET by inspecting the relevant settings in the CA's directory object, as per
Section 3.4 of
RFC 8739. If the CA does not support unauthenticated GET of STAR certificates, the IdO
MUST NOT forward the Order request. Instead, it
MUST move the Order status to
invalid and set the
allow-certificate-get in the
auto-renewal object to
false. The same occurs in case the Order request is forwarded and the CA does not reflect the
allow-certificate-get setting in its Order resource. The combination of
invalid status and denied
allow-certificate-get in the Order resource at the IdO provides an unambiguous (asynchronous) signal to the NDC about the failure reason.
If one of the objects in the
identifiers list is of type
dns, the IdO can add the CNAME records specified in the
delegation object to its zone, for example:
abc.ido.example. CNAME abc.ndc.example.
If the delegation is for a non-STAR certificate, the request object created by the NDC:
-
MUST have a delegation attribute indicating the preconfigured delegationthat applies to this Order;
-
MUST have entries in the identifiers field for each delegated namepresent in the configuration; and
-
MUST have the allow-certificate-get attribute set to true.
POST /acme/new-order HTTP/1.1
Host: acme.ido.example
Content-Type: application/jose+json
{
"protected": base64url({
"alg": "ES256",
"kid": "https://acme.ido.example/acme/acct/evOfKhNU60wg",
"nonce": "IYBkoQfaCS80UcCn9qH8Gt",
"url": "https://acme.ido.example/acme/new-order"
}),
"payload": base64url({
"identifiers": [
{
"type": "dns",
"value": "abc.ido.example"
}
],
"delegation":
"https://acme.ido.example/acme/delegation/gm0wfLYHBen",
"allow-certificate-get": true
}),
"signature": "j9JBUvMigi4zodud...acYkEKaa8gqWyZ6H"
}
The order object that is created on the IdO:
-
MUST start in the ready state;
-
MUST contain an authorizations array with zero elements;
-
MUST contain the indicated delegation configuration; and
-
MUST contain the indicated allow-certificate-get setting.
{
"status": "ready",
"expires": "2021-05-01T00:00:00Z",
"identifiers": [
{
"type": "dns",
"value": "abc.ido.example"
}
],
"delegation":
"https://acme.ido.example/acme/delegation/gm0wfLYHBen",
"allow-certificate-get": true,
"authorizations": [],
"finalize": "https://acme.ido.example/acme/order/3ZDlhYy/finalize"
}
The Order finalization by the NDC and the subsequent validation of the CSR by the IdO proceed in the same way as for the STAR case. If the CSR is successfully validated, the order object status moves to
processing and the twin ACME protocol instance is initiated on the IdO-CA side.
The request object created by the IdO:
-
MUST copy the identifiers sent by the NDC;
-
MUST strip the delegation attribute; and
-
MUST copy the allow-certificate-get attribute.
When the identifiers' authorization has been successfully completed and the certificate has been issued by the CA, the IdO:
-
MUST move its Order resource status to valid and
-
MUST copy the certificate field from the Order returned by the CA into itsOrder resource, as well as notBefore and notAfter if these fields exist.
{
"status": "valid",
"expires": "2021-05-01T00:00:00Z",
"identifiers": [
{
"type": "dns",
"value": "abc.ido.example"
}
],
"delegation":
"https://acme.ido.example/acme/delegation/gm0wfLYHBen",
"allow-certificate-get": true,
"authorizations": [],
"finalize": "https://acme.ido.example/acme/order/3ZDlhYy/finalize",
"certificate": "https://acme.ca.example/acme/order/YtR23SsdG9"
}
At this point of the protocol flow, the same considerations as in
Section 2.3.2.1 apply.
Before forwarding the Order request to the CA, the IdO
SHOULD ensure that the selected CA supports unauthenticated GET by inspecting the relevant settings in the CA's directory object, as per
Section 2.3.5. If the CA does not support unauthenticated GET of certificate resources, the IdO
MUST NOT forward the Order request. Instead, it
MUST move the Order status to
invalid and set the
allow-certificate-get attribute to
false. The same occurs in case the Order request is forwarded and the CA does not reflect the
allow-certificate-get setting in its Order resource. The combination of
invalid status and denied
allow-certificate-get in the Order resource at the IdO provides an unambiguous (asynchronous) signal to the NDC about the failure reason.
In order to help a client discover support for this profile, the directory object of an ACME server (typically, one deployed by the IdO) contains the following attribute in the
meta field:
-
delegation-enabled (optional, boolean):
-
Boolean flag indicating support forthe profile specified in this memo. An ACME server that supports thisdelegation profile MUST include this key and MUST set it to true.
The IdO
MUST declare its support for delegation using
delegation-enabled regardless of whether it supports delegation of STAR certificates, non-STAR certificates, or both.
In order to help a client discover support for certificate fetching using unauthenticated HTTP GET, the directory object of an ACME server (typically, one deployed by the CA) contains the following attribute in the
meta field:
In order to enable the name delegation of non-STAR certificates, this document defines a mechanism that allows a server to advertise support for accessing certificate resources via unauthenticated GET (in addition to POST-as-GET) and a client to enable this service with per-Order granularity.
It is worth pointing out that the protocol elements described in this section have the same names and semantics as those introduced in
Section 3.4 of
RFC 8739 for the STAR use case (except, of course, they apply to the certificate resource rather than the star-certificate resource). However, they differ in terms of their position in the directory meta and order objects; rather than being wrapped in an
auto-renewal subobject, they are located at the top level.
A server states its availability to grant unauthenticated access to a client's Order certificate by setting the
allow-certificate-get attribute to
true in the
meta field inside the directory object:
-
allow-certificate-get (optional, boolean):
-
If this field is present and setto true, the server allows GET (and HEAD) requests to certificate URLs.
A client states its desire to access the issued certificate via unauthenticated GET by adding an
allow-certificate-get attribute to the payload of its newOrder request and setting it to
true.
-
allow-certificate-get (optional, boolean):
-
If this field is present and setto true, the client requests the server to allow unauthenticated GET (andHEAD) to the certificate associated with this Order.
If the server accepts the request, it
MUST reflect the attribute setting in the resulting order object.
Note that even when the use of unauthenticated GET has been agreed upon, the server
MUST also allow POST-as-GET requests to the certificate resource.
Identity delegation is terminated differently depending on whether or not this is a STAR certificate.
The IdO can terminate the delegation of a STAR certificate by requesting its cancellation (see
Section 3.1.2 of
RFC 8739).
Cancellation of the ACME STAR certificate is a prerogative of the IdO. The NDC does not own the relevant account key on the CA; therefore, it can't issue a cancellation request for the STAR certificate. Potentially, since it holds the STAR certificate's private key, it could request the revocation of a single STAR certificate. However, STAR explicitly disables the revokeCert interface.
Shortly after the automatic renewal process is stopped by the IdO, the last issued STAR certificate expires and the delegation terminates.
The IdO can terminate the delegation of a non-STAR certificate by requesting it to be revoked using the
revokeCert URL exposed by the CA.
According to
Section 7.6 of
RFC 8555, the revocation endpoint can be used with either the account key pair or the certificate key pair. In other words, an NDC that learns the
revokeCert URL of the CA (which is publicly available via the CA's directory object) would be able to revoke the certificate using the associated private key. However, given the trust relationship between the NDC and IdO expected by the delegation trust model (
Section 7.1), as well as the lack of incentives for the NDC to prematurely terminate the delegation, this does not represent a significant security risk.
There are cases where the ACME Delegation flow should be proxied, such as the use case described in
Section 5.1.2. This section describes the behavior of such proxies.
An entity implementing the IdO server role -- an "ACME Delegation server" -- may behave, on a per-identity case, either as a proxy into another ACME Delegation server or as an IdO and obtain a certificate directly. The determining factor is whether it can successfully be authorized by the next-hop ACME server for the identity associated with the certificate request.
The identities supported by each server and the disposition for each of them are preconfigured.
Following is the proxy's behavior for each of the messages exchanged in the ACME Delegation process:
-
New-order request:
-
-
The complete identifiers attribute MUST be copied as is.
-
Similarly, the auto-renewal object MUST be copied as is.
-
New-order response:
-
-
The status, expires, authorizations, identifiers, and auto-renewal attributes/objects MUST be copied as is.
-
The finalize URL is rewritten so that the finalize request will be made to the proxy.
-
Similarly, the Location header MUST be rewritten to point to an order object on the proxy.
-
Any Link relations MUST be rewritten to point to the proxy.
-
Get Order response:
-
-
The status, expires, authorizations, identifiers, and auto-renewal attributes/objects MUST be copied as is.
-
Similarly, the star-certificate URL (or the certificate URL in case of non-STAR requests) MUST be copied as is.
-
The finalize URL is rewritten so that the finalize request will be made to the proxy.
-
The Location header MUST be rewritten to point to an order object on the proxy.
-
Any Link relations MUST be rewritten to point to the proxy.
-
finalize request:
-
-
The CSR MUST be copied as is.
-
finalize response:
-
-
The Location header, Link relations, and the finalize URLs are rewritten as for Get Order.
We note that all the above messages are authenticated; therefore, each proxy must be able to authenticate any subordinate server.