As noted in the previous section, ACME [
RFC 8555] does not mandate that the
identifier in a newOrder request matches the
identifier in authorization objects. This means that the ACME specification does not preclude an ACME server processing newOrder requests and issuing certificates for a subdomain without requiring a challenge to be fulfilled against that explicit subdomain.
ACME server policy could allow issuance of certificates for a subdomain to a client where the client only has to fulfill an authorization challenge for an ancestor domain of that subdomain. For example, this allows for a flow where a client proves ownership of
example.org and then successfully obtains a certificate for
sub.example.org.
ACME server policy is out of scope of this document; however, some commentary is provided in
Section 7.3.
Clients need a mechanism to instruct the ACME server that they are requesting authorization for all subdomains subordinate to the specified domain, as opposed to just requesting authorization for an explicit domain identifier. Clients need a mechanism to do this in both newAuthz and newOrder requests. ACME servers need a mechanism to indicate to clients that authorization objects are valid for all subdomains under the specified domain. These are described in this section.
ACME (
RFC 8555,
Section 7.1.4) defines the authorization object. This document defines a new
subdomainAuthAllowed field for the authorization object. When ACME server policy allows authorization for subdomains subordinate to a domain, the server indicates this by including the new
subdomainAuthAllowed field in the authorization object for that domain identifier:
-
subdomainAuthAllowed (optional, boolean):
-
If present, this field MUST be true for authorizations where ACME server policy allows certificates to be issued for any subdomain subordinate to the domain specified in the identifier field of the authorization object.
The following example shows an authorization object for the domain
example.org, where the authorization covers the subdomains subordinate to
example.org.
{
"status": "valid",
"expires": "2023-09-01T14:09:07.99Z",
"identifier": {
"type": "dns",
"value": "example.org"
},
"challenges": [
{
"url": "https://example.com/acme/chall/prV_B7yEyA4",
"type": "http-01",
"status": "valid",
"token": "DGyRejmCefe7v4NfDGDKfA",
"validated": "2014-12-01T12:05:58.16Z"
}
],
"subdomainAuthAllowed": true
}
If the
subdomainAuthAllowed field is not included, then the assumed default value is false.
If ACME server policy allows issuance of certificates containing wildcard identifiers under that authorization object, then the server
SHOULD include the
wildcard field with a value of true, as per
RFC 8555,
Section 7.1.4.
The basic ACME workflow has authorization objects created reactively in response to a certificate order. ACME also allows for pre-authorization, where clients obtain authorization for an identifier proactively, outside of the context of a specific issuance. With the ACME pre-authorization flow, a client can pre-authorize for a domain once and then issue multiple newOrder requests for certificates with identifiers in the subdomains subordinate to that domain.
ACME (
RFC 8555,
Section 7.4.1) defines the
identifier object for newAuthz requests. This document defines a new
subdomainAuthAllowed field for the
identifier object:
-
subdomainAuthAllowed (optional, boolean):
-
An ACME client sets this flag to indicate to the server that it is requesting an authorization for the subdomains subordinate to the specified domain identifier value.
Clients include the new
subdomainAuthAllowed field in the
identifier object of newAuthz requests to indicate that they are requesting a subdomain authorization. In the following example of a newAuthz payload, the client is requesting pre-authorization for the subdomains subordinate to
example.org.
"payload": base64url({
"identifier": {
"type": "dns",
"value": "example.org",
"subdomainAuthAllowed": true
}
})
If the server is willing to allow a single authorization for the subdomains and there is not an existing authorization object for the identifier, then it will create an authorization object and include the
subdomainAuthAllowed flag with a value of true.
If the server policy does not allow creation of subdomain authorizations subordinate to that domain, the server can create an authorization object for the indicated identifier and
MAY include the
subdomainAuthAllowed flag with a value of false. If the server creates an authorization object and does not include the
subdomainAuthAllowed flag, then the assumed value is false.
In both scenarios, handling of the pre-authorization follows the process documented in ACME
RFC 8555,
Section 7.4.1.
Clients need a mechanism to optionally indicate to servers whether or not they are authorized to fulfill challenges against an ancestor domain for a given identifier. For example, if a client places an order for an identifier
foo.bar.example.org and is authorized to fulfill a challenge against the ancestor domains
bar.example.org or
example.org, then the client needs a mechanism to indicate control over the ancestor domains to the ACME server.
In order to accomplish this, this document defines a new
ancestorDomain field for the identifier that is included in order objects.
-
ancestorDomain (optional, string):
-
This is an ancestor domain of the requested identifier. The client MUST be able to fulfill a challenge against the ancestor domain.
This field specifies an ancestor domain of the identifier that the client has DNS control over and is capable of fulfilling challenges against. Based on server policy, the server can choose to issue a challenge against any ancestor domain of the identifier up to and including the specified
ancestorDomain and create a corresponding authorization object against the chosen identifier.
In the following example of a newOrder payload, the client requests a certificate for identifier
foo.bar.example.org and indicates that it can fulfill a challenge against the ancestor domain
bar.example.org. The server can then choose to issue a challenge against either
foo.bar.example.org or
bar.example.org identifiers.
"payload": base64url({
"identifiers": [
{ "type": "dns",
"value": "foo.bar.example.org",
"ancestorDomain": "bar.example.org" }
],
"notBefore": "2023-09-01T00:04:00+04:00",
"notAfter": "2023-09-08T00:04:00+04:00"
})
In the following example of a newOrder payload, the client requests a certificate for identifier
foo.bar.example.org and indicates that it can fulfill a challenge against the ancestor domain
example.org. The server can then choose to issue a challenge against any one of
foo.bar.example.org,
bar.example.org, or
example.org identifiers.
"payload": base64url({
"identifiers": [
{ "type": "dns",
"value": "foo.bar.example.org",
"ancestorDomain": "example.org" }
],
"notBefore": "2023-09-01T00:04:00+04:00",
"notAfter": "2023-09-08T00:04:00+04:00"
})
If the client is unable to fulfill authorizations against an ancestor domain, the client should not include the
ancestorDomain field.
Server newOrder handling generally follows the process documented in ACME (
Section 7.4 of
RFC 8555). If the server is willing to allow subdomain authorizations for the domain specified in
ancestorDomain, then it creates an authorization object against that ancestor domain and includes the
subdomainAuthAllowed flag with a value of true.
If the server policy does not allow creation of subdomain authorizations against that ancestor domain, then it can create an authorization object for the indicated identifier value and
SHOULD NOT include the
subdomainAuthAllowed flag. As the client requested a subdomain authorization for the ancestor domain and not for the indicated identifier, there is no need for the server to include the
subdomainAuthAllowed flag in the authorization object for the indicated identifier.
This document defines a new
subdomainAuthAllowed ACME directory metadata field. An ACME server can advertise support for authorization of subdomains by including the
subdomainAuthAllowed boolean flag in its "ACME Directory Metadata Fields" registry:
-
subdomainAuthAllowed (optional, bool):
-
Indicates if an ACME server supports authorization of subdomains.
If not specified, then the assumed default value is false. If an ACME server supports authorization of subdomains, it can indicate this by including this field with a value of "true".