rfc9444v1.txt   rfc9444.txt 
Internet Engineering Task Force (IETF) O. Friel Internet Engineering Task Force (IETF) O. Friel
Request for Comments: 9444 R. Barnes Request for Comments: 9444 R. Barnes
Category: Standards Track Cisco Category: Standards Track Cisco
ISSN: 2070-1721 T. Hollebeek ISSN: 2070-1721 T. Hollebeek
DigiCert DigiCert
M. Richardson M. Richardson
Sandelman Software Works Sandelman Software Works
July 2023 August 2023
Automated Certificate Management Environment (ACME) for Subdomains Automated Certificate Management Environment (ACME) for Subdomains
Abstract Abstract
This document specifies how Automated Certificate Management This document specifies how Automated Certificate Management
Environment (ACME) can be used by a client to obtain a certificate Environment (ACME) can be used by a client to obtain a certificate
for a subdomain identifier from a certification authority. for a subdomain identifier from a certification authority.
Additionally, this document specifies how a client can fulfill a Additionally, this document specifies how a client can fulfill a
challenge against an ancestor domain but may not need to fulfill a challenge against an ancestor domain but may not need to fulfill a
skipping to change at line 113 skipping to change at line 113
a portion of the graph of all possible domain names. a portion of the graph of all possible domain names.
Domain Name: Domain Name:
An ordered list of one or more labels. An ordered list of one or more labels.
Fully-Qualified Domain Name (FQDN): Fully-Qualified Domain Name (FQDN):
This is often just a clear way of saying the same thing as "domain This is often just a clear way of saying the same thing as "domain
name of a node", as outlined above. However, the term is name of a node", as outlined above. However, the term is
ambiguous. Strictly speaking, a fully-qualified domain name would ambiguous. Strictly speaking, a fully-qualified domain name would
include every label, including the zero-length label of the root: include every label, including the zero-length label of the root:
such a name would be written "www.example.net." (note the such a name would be written www.example.net. (note the
terminating dot). But, because every name eventually shares the terminating dot). But, because every name eventually shares the
common root, names are often written relative to the root (such as common root, names are often written relative to the root (such as
"www.example.net") and are still called "fully qualified". This www.example.net) and are still called "fully qualified". This
term first appeared in [RFC0819]. In this document, names are term first appeared in [RFC0819]. In this document, names are
often written relative to the root. often written relative to the root.
The following definition for "subdomain" is taken from "DNS The following definition for "subdomain" is taken from "DNS
Terminology" [RFC8499] and reproduced here; however, the definition Terminology" [RFC8499] and reproduced here; however, the definition
is ambiguous and is further clarified below: is ambiguous and is further clarified below:
Subdomain: Subdomain:
"A domain is a subdomain of another domain if it is contained "A domain is a subdomain of another domain if it is contained
within that domain. This relationship can be tested by seeing if within that domain. This relationship can be tested by seeing if
the subdomain's name ends with the containing domain's name." the subdomain's name ends with the containing domain's name."
(Quoted from Section 3.1 of [RFC1034].) For example, in the host (Quoted from Section 3.1 of [RFC1034].) For example, in the host
name "nnn.mmm.example.com", both "mmm.example.com" and name nnn.mmm.example.com, both mmm.example.com and
"nnn.mmm.example.com" are subdomains of "example.com". Note that nnn.mmm.example.com are subdomains of example.com. Note that the
the comparisons here are done on whole labels; that is, comparisons here are done on whole labels; that is,
"ooo.example.com" is not a subdomain of "oo.example.com". ooo.example.com is not a subdomain of oo.example.com.
The definition is ambiguous as it appears to allow a subdomain to The definition is ambiguous as it appears to allow a subdomain to
include the given domain. That is, "mmm.example.com" ends with include the given domain. That is, mmm.example.com ends with
"mmm.example.com" and thus is a subdomain of itself. This document mmm.example.com and thus is a subdomain of itself. This document
interprets the first sentence of the above definition as meaning "a interprets the first sentence of the above definition as meaning "a
domain is a subdomain of a different domain if it is contained within domain is a subdomain of a different domain if it is contained within
that different domain". A domain cannot be a subdomain of itself. that different domain". A domain cannot be a subdomain of itself.
For example, "mmm.example.com" is not a subdomain of For example, mmm.example.com is not a subdomain of mmm.example.com.
"mmm.example.com".
The following additional terms are used in this document: The following additional terms are used in this document:
Certification Authority (CA): Certification Authority (CA):
An organization that is responsible for the creation, issuance, An organization that is responsible for the creation, issuance,
revocation, and management of Certificates. The term applies revocation, and management of Certificates. The term applies
equally to both root CAs and subordinate CAs. Refer to [RFC5280] equally to both root CAs and subordinate CAs. Refer to [RFC5280]
for detailed information on Certification Authorities. for detailed information on Certification Authorities.
CSR: CSR:
Certificate Signing Request, as defined in [RFC2986]. Certificate Signing Request, as defined in [RFC2986].
Ancestor Domain: Ancestor Domain:
A domain is an ancestor domain of a subdomain if it contains that A domain is an ancestor domain of a subdomain if it contains that
subdomain and has less labels than that subdomain. A domain subdomain and has less labels than that subdomain. A domain
cannot be an ancestor domain of itself. For example, for the host cannot be an ancestor domain of itself. For example, for the host
name "nnn.mmm.example.com", both "mmm.example.com" and name nnn.mmm.example.com, both mmm.example.com and example.com are
"example.com" are ancestor domains of "nnn.mmm.example.com". ancestor domains of nnn.mmm.example.com. However,
However, "nnn.mmm.example.com" is not an ancestor domain of nnn.mmm.example.com is not an ancestor domain of
"nnn.mmm.example.com". Note that the comparisons here are done on nnn.mmm.example.com. Note that the comparisons here are done on
whole labels; that is, "oo.example.com" is not an ancestor domain whole labels; that is, oo.example.com is not an ancestor domain of
of "ooo.example.com". ooo.example.com.
[RFC8555] defines the following object types that are used in this [RFC8555] defines the following object types that are used in this
document: document:
Order Object: An ACME order object represents a client's request for Order Object: An ACME order object represents a client's request for
a certificate and is used to track the progress of that order a certificate and is used to track the progress of that order
through to issuance. through to issuance.
Authorization Object: An ACME authorization object represents a Authorization Object: An ACME authorization object represents a
server's authorization for an account to represent an identifier. server's authorization for an account to represent an identifier.
skipping to change at line 192 skipping to change at line 191
POST-as-GET Request: POST-as-GET Request:
When a client wishes to fetch a resource from the server, then it When a client wishes to fetch a resource from the server, then it
MUST send a POST request with a signed JSON Web Signature (JWS) MUST send a POST request with a signed JSON Web Signature (JWS)
body, where the JWS body is specified in ACME [RFC8555], body, where the JWS body is specified in ACME [RFC8555],
Section 6.2. ACME refers to these as "POST-as-GET" requests. Section 6.2. ACME refers to these as "POST-as-GET" requests.
3. ACME Workflow and Identifier Requirements 3. ACME Workflow and Identifier Requirements
A typical ACME workflow for issuance of certificates is as follows: A typical ACME workflow for issuance of certificates is as follows:
1. Client POSTs a newOrder request that contains a set of 1. Client POSTs a newOrder request that contains a set of identifier
"identifiers". objects in the identifiers field of the ACME order object.
2. Server replies with an order object that contains a set of links 2. Server replies with an order object that contains a set of links
to authorization object(s) and a "finalize" URI. to authorization object(s) and a finalize URI.
3. Client sends POST-as-GET requests to retrieve the authorization 3. Client sends POST-as-GET requests to retrieve the authorization
object(s), with the downloaded authorization object(s) containing object(s), with the downloaded authorization object(s) containing
the "identifier" that the client must prove that they control, the identifier that the client must prove that they control, and
and a set of links to associated challenges objects, one of which a set of links to associated challenges objects, one of which the
the client must fulfill. client must fulfill.
4. Client proves control over the "identifier" in the authorization 4. Client proves control over the identifier in the authorization
object by completing one of the specified challenges, for object by completing one of the specified challenges, for
example, by publishing a DNS TXT record. example, by publishing a DNS TXT record.
5. Client POSTs a CSR to the "finalize" API. 5. Client POSTs a CSR to the finalize API.
6. Server replies with an updated order object that includes a 6. Server replies with an updated order object that includes a
"certificate" URI. certificate URI.
7. Client sends a POST-as-GET request to the "certificate" URI to 7. Client sends a POST-as-GET request to the certificate URI to
download the certificate. download the certificate.
ACME places the following restrictions on "identifiers": ACME places the following restrictions on identifiers:
* [RFC8555], Section 7.1.3: "The authorizations required are * [RFC8555], Section 7.1.3: "The authorizations required are
dictated by server policy; there may not be a 1:1 relationship dictated by server policy; there may not be a 1:1 relationship
between the order identifiers and the authorizations required." between the order identifiers and the authorizations required."
* [RFC8555], Section 7.1.4: The only type of "identifier" defined by * [RFC8555], Section 7.1.4: The only type of identifier defined by
the ACME specification is an FQDN: "The only type of identifier the ACME specification is an FQDN: "The only type of identifier
defined by this specification is a fully qualified domain name defined by this specification is a fully qualified domain name
(type: "dns"). The domain name MUST be encoded in the form in (type: "dns"). The domain name MUST be encoded in the form in
which it would appear in a certificate." which it would appear in a certificate."
* [RFC8555], Section 7.4: The "identifier" in the CSR request must * [RFC8555], Section 7.4: The identifier in the CSR request must
match the "identifier" in the newOrder request: "The CSR MUST match the identifier in the newOrder request: "The CSR MUST
indicate the exact same set of requested identifiers as the indicate the exact same set of requested identifiers as the
initial newOrder request." initial newOrder request."
* [RFC8555], Section 8.3: The "identifier", or FQDN, in the * [RFC8555], Section 8.3: The identifier, or FQDN, in the
authorization object must be used when fulfilling challenges via authorization object must be used when fulfilling challenges via
HTTP: "Construct a URL by populating the URL template ... where HTTP: "Construct a URL by populating the URL template ... where
the domain field is set to the domain name being verified." the domain field is set to the domain name being verified."
* [RFC8555], Section 8.4: The "identifier", or FQDN, in the * [RFC8555], Section 8.4: The identifier, or FQDN, in the
authorization object must be used when fulfilling challenges via authorization object must be used when fulfilling challenges via
DNS: "The client constructs the validation domain name by DNS: "The client constructs the validation domain name by
prepending the label "_acme-challenge" to the domain name being prepending the label "_acme-challenge" to the domain name being
validated." validated."
ACME does not mandate that the "identifier" in a newOrder request ACME does not mandate that the identifier in a newOrder request
matches the "identifier" in authorization objects. matches the identifier in authorization objects.
The ACME base document [RFC8555] only specifies the "dns" identifier The ACME base document [RFC8555] only specifies the "dns" identifier
type. Additional identifiers may be defined and registered in the type. Additional identifiers may be defined and registered in the
IANA [ACME-Identifier-Types] registry. For example, [RFC8738] IANA [ACME-Identifier-Types] registry. For example, [RFC8738]
specifies the "ip" identifier type. This document is only relevant specifies the "ip" identifier type. This document is only relevant
for the "dns" identifier type. for the "dns" identifier type.
Note that ACME supports multiple different validation methods that Note that ACME supports multiple different validation methods that
can be used to fulfill challenges and prove ownership of identifiers. can be used to fulfill challenges and prove ownership of identifiers.
Validation methods are registered in the IANA Validation methods are registered in the IANA
[ACME-Validation-Methods] registry. This document does not mandate [ACME-Validation-Methods] registry. This document does not mandate
use of any particular validation method or methods. ACME server use of any particular validation method or methods. ACME server
policy dictates which validation methods are supported. See policy dictates which validation methods are supported. See
Section 7.3 for more information on ACME server policy. Section 7.3 for more information on ACME server policy.
4. ACME Issuance of Subdomain Certificates 4. ACME Issuance of Subdomain Certificates
As noted in the previous section, ACME [RFC8555] does not mandate As noted in the previous section, ACME [RFC8555] does not mandate
that the "identifier" in a newOrder request matches the "identifier" that the identifier in a newOrder request matches the identifier in
in authorization objects. This means that the ACME specification authorization objects. This means that the ACME specification does
does not preclude an ACME server processing newOrder requests and not preclude an ACME server processing newOrder requests and issuing
issuing certificates for a subdomain without requiring a challenge to certificates for a subdomain without requiring a challenge to be
be fulfilled against that explicit subdomain. fulfilled against that explicit subdomain.
ACME server policy could allow issuance of certificates for a ACME server policy could allow issuance of certificates for a
subdomain to a client where the client only has to fulfill an subdomain to a client where the client only has to fulfill an
authorization challenge for an ancestor domain of that subdomain. authorization challenge for an ancestor domain of that subdomain.
This allows a flow where a client proves ownership of, for example, For example, this allows for a flow where a client proves ownership
"example.org" and then successfully obtains a certificate for of example.org and then successfully obtains a certificate for
"sub.example.org". sub.example.org.
ACME server policy is out of scope of this document; however, some ACME server policy is out of scope of this document; however, some
commentary is provided in Section 7.3. commentary is provided in Section 7.3.
Clients need a mechanism to instruct the ACME server that they are Clients need a mechanism to instruct the ACME server that they are
requesting authorization for all subdomains subordinate to the requesting authorization for all subdomains subordinate to the
specified domain, as opposed to just requesting authorization for an specified domain, as opposed to just requesting authorization for an
explicit domain identifier. Clients need a mechanism to do this in explicit domain identifier. Clients need a mechanism to do this in
both newAuthz and newOrder requests. ACME servers need a mechanism both newAuthz and newOrder requests. ACME servers need a mechanism
to indicate to clients that authorization objects are valid for all to indicate to clients that authorization objects are valid for all
subdomains under the specified domain. These are described in this subdomains under the specified domain. These are described in this
section. section.
4.1. Authorization Object 4.1. Authorization Object
ACME ([RFC8555], Section 7.1.4) defines the authorization object. ACME ([RFC8555], Section 7.1.4) defines the authorization object.
This document defines a new "subdomainAuthAllowed" field for the This document defines a new subdomainAuthAllowed field for the
authorization object. When ACME server policy allows authorization authorization object. When ACME server policy allows authorization
for subdomains subordinate to a domain, the server indicates this by for subdomains subordinate to a domain, the server indicates this by
including the new "subdomainAuthAllowed" field in the authorization including the new subdomainAuthAllowed field in the authorization
object for that domain identifier: object for that domain identifier:
subdomainAuthAllowed (optional, boolean): If present, this field subdomainAuthAllowed (optional, boolean): If present, this field
MUST be true for authorizations where ACME server policy allows MUST be true for authorizations where ACME server policy allows
certificates to be issued for any subdomain subordinate to the certificates to be issued for any subdomain subordinate to the
domain specified in the 'identifier' field of the authorization domain specified in the identifier field of the authorization
object. object.
The following example shows an authorization object for the domain The following example shows an authorization object for the domain
example.org, where the authorization covers the subdomains example.org, where the authorization covers the subdomains
subordinate to example.org. subordinate to example.org.
{ {
"status": "valid", "status": "valid",
"expires": "2023-09-01T14:09:07.99Z", "expires": "2023-09-01T14:09:07.99Z",
skipping to change at line 330 skipping to change at line 329
"type": "http-01", "type": "http-01",
"status": "valid", "status": "valid",
"token": "DGyRejmCefe7v4NfDGDKfA", "token": "DGyRejmCefe7v4NfDGDKfA",
"validated": "2014-12-01T12:05:58.16Z" "validated": "2014-12-01T12:05:58.16Z"
} }
], ],
"subdomainAuthAllowed": true "subdomainAuthAllowed": true
} }
If the "subdomainAuthAllowed" field is not included, then the assumed If the subdomainAuthAllowed field is not included, then the assumed
default value is false. default value is false.
If ACME server policy allows issuance of certificates containing If ACME server policy allows issuance of certificates containing
wildcard identifiers under that authorization object, then the server wildcard identifiers under that authorization object, then the server
SHOULD include the "wildcard" field with a value of true, as per SHOULD include the wildcard field with a value of true, as per
[RFC8555], Section 7.1.4. [RFC8555], Section 7.1.4.
4.2. Pre-authorization 4.2. Pre-authorization
The basic ACME workflow has authorization objects created reactively The basic ACME workflow has authorization objects created reactively
in response to a certificate order. ACME also allows for pre- in response to a certificate order. ACME also allows for pre-
authorization, where clients obtain authorization for an identifier authorization, where clients obtain authorization for an identifier
proactively, outside of the context of a specific issuance. With the proactively, outside of the context of a specific issuance. With the
ACME pre-authorization flow, a client can pre-authorize for a domain ACME pre-authorization flow, a client can pre-authorize for a domain
once and then issue multiple newOrder requests for certificates with once and then issue multiple newOrder requests for certificates with
identifiers in the subdomains subordinate to that domain. identifiers in the subdomains subordinate to that domain.
ACME ([RFC8555], Section 7.4.1) defines the "identifier" object for ACME ([RFC8555], Section 7.4.1) defines the identifier object for
newAuthz requests. This document defines a new newAuthz requests. This document defines a new subdomainAuthAllowed
"subdomainAuthAllowed" field for the "identifier" object: field for the identifier object:
subdomainAuthAllowed (optional, boolean): An ACME client sets this subdomainAuthAllowed (optional, boolean): An ACME client sets this
flag to indicate to the server that it is requesting an flag to indicate to the server that it is requesting an
authorization for the subdomains subordinate to the specified authorization for the subdomains subordinate to the specified
domain identifier value. domain identifier value.
Clients include the new "subdomainAuthAllowed" field in the Clients include the new subdomainAuthAllowed field in the identifier
"identifier" object of newAuthz requests to indicate that they are object of newAuthz requests to indicate that they are requesting a
requesting a subdomain authorization. In the following example of a subdomain authorization. In the following example of a newAuthz
newAuthz payload, the client is requesting pre-authorization for the payload, the client is requesting pre-authorization for the
subdomains subordinate to example.org. subdomains subordinate to example.org.
"payload": base64url({ "payload": base64url({
"identifier": { "identifier": {
"type": "dns", "type": "dns",
"value": "example.org", "value": "example.org",
"subdomainAuthAllowed": true "subdomainAuthAllowed": true
} }
}) })
If the server is willing to allow a single authorization for the If the server is willing to allow a single authorization for the
subdomains and there is not an existing authorization object for the subdomains and there is not an existing authorization object for the
identifier, then it will create an authorization object and include identifier, then it will create an authorization object and include
the "subdomainAuthAllowed" flag with a value of true. the subdomainAuthAllowed flag with a value of true.
If the server policy does not allow creation of subdomain If the server policy does not allow creation of subdomain
authorizations subordinate to that domain, the server can create an authorizations subordinate to that domain, the server can create an
authorization object for the indicated identifier and MAY include the authorization object for the indicated identifier and MAY include the
"subdomainAuthAllowed" flag with a value of false. If the server subdomainAuthAllowed flag with a value of false. If the server
creates an authorization object and does not include the creates an authorization object and does not include the
"subdomainAuthAllowed" flag, then the assumed value is false. subdomainAuthAllowed flag, then the assumed value is false.
In both scenarios, handling of the pre-authorization follows the In both scenarios, handling of the pre-authorization follows the
process documented in ACME [RFC8555], Section 7.4.1. process documented in ACME [RFC8555], Section 7.4.1.
4.3. New Orders 4.3. New Orders
Clients need a mechanism to optionally indicate to servers whether or Clients need a mechanism to optionally indicate to servers whether or
not they are authorized to fulfill challenges against an ancestor not they are authorized to fulfill challenges against an ancestor
domain for a given identifier. For example, if a client places an domain for a given identifier. For example, if a client places an
order for an identifier foo.bar.example.org and is authorized to order for an identifier foo.bar.example.org and is authorized to
fulfill a challenge against the ancestor domains bar.example.org or fulfill a challenge against the ancestor domains bar.example.org or
example.org, then the client needs a mechanism to indicate control example.org, then the client needs a mechanism to indicate control
over the ancestor domains to the ACME server. over the ancestor domains to the ACME server.
In order to accomplish this, this document defines a new In order to accomplish this, this document defines a new
"ancestorDomain" field for the identifier that is included in order ancestorDomain field for the identifier that is included in order
objects. objects.
ancestorDomain (optional, string): This is an ancestor domain of the ancestorDomain (optional, string): This is an ancestor domain of the
requested identifier. The client MUST be able to fulfill a requested identifier. The client MUST be able to fulfill a
challenge against the ancestor domain. challenge against the ancestor domain.
This field specifies an ancestor domain of the identifier that the This field specifies an ancestor domain of the identifier that the
client has DNS control over and is capable of fulfilling challenges client has DNS control over and is capable of fulfilling challenges
against. Based on server policy, the server can choose to issue a against. Based on server policy, the server can choose to issue a
challenge against any ancestor domain of the identifier up to and challenge against any ancestor domain of the identifier up to and
including the specified "ancestorDomain" and create a corresponding including the specified ancestorDomain and create a corresponding
authorization object against the chosen identifier. authorization object against the chosen identifier.
In the following example of a newOrder payload, the client requests a In the following example of a newOrder payload, the client requests a
certificate for identifier foo.bar.example.org and indicates that it certificate for identifier foo.bar.example.org and indicates that it
can fulfill a challenge against the ancestor domain bar.example.org. can fulfill a challenge against the ancestor domain bar.example.org.
The server can then choose to issue a challenge against either The server can then choose to issue a challenge against either
foo.bar.example.org or bar.example.org identifiers. foo.bar.example.org or bar.example.org identifiers.
"payload": base64url({ "payload": base64url({
"identifiers": [ "identifiers": [
skipping to change at line 444 skipping to change at line 443
"identifiers": [ "identifiers": [
{ "type": "dns", { "type": "dns",
"value": "foo.bar.example.org", "value": "foo.bar.example.org",
"ancestorDomain": "example.org" } "ancestorDomain": "example.org" }
], ],
"notBefore": "2023-09-01T00:04:00+04:00", "notBefore": "2023-09-01T00:04:00+04:00",
"notAfter": "2023-09-08T00:04:00+04:00" "notAfter": "2023-09-08T00:04:00+04:00"
}) })
If the client is unable to fulfill authorizations against an ancestor If the client is unable to fulfill authorizations against an ancestor
domain, the client should not include the "ancestorDomain" field. domain, the client should not include the ancestorDomain field.
Server newOrder handling generally follows the process documented in Server newOrder handling generally follows the process documented in
ACME (Section 7.4 of [RFC8555]). If the server is willing to allow ACME (Section 7.4 of [RFC8555]). If the server is willing to allow
subdomain authorizations for the domain specified in subdomain authorizations for the domain specified in ancestorDomain,
"ancestorDomain", then it creates an authorization object against then it creates an authorization object against that ancestor domain
that ancestor domain and includes the "subdomainAuthAllowed" flag and includes the subdomainAuthAllowed flag with a value of true.
with a value of true.
If the server policy does not allow creation of subdomain If the server policy does not allow creation of subdomain
authorizations against that ancestor domain, then it can create an authorizations against that ancestor domain, then it can create an
authorization object for the indicated identifier value and SHOULD authorization object for the indicated identifier value and SHOULD
NOT include the "subdomainAuthAllowed" flag. As the client requested NOT include the subdomainAuthAllowed flag. As the client requested a
a subdomain authorization for the ancestor domain and not for the subdomain authorization for the ancestor domain and not for the
indicated identifier, there is no need for the server to include the indicated identifier, there is no need for the server to include the
"subdomainAuthAllowed" flag in the authorization object for the subdomainAuthAllowed flag in the authorization object for the
indicated identifier. indicated identifier.
4.4. Directory Object Metadata 4.4. Directory Object Metadata
This document defines a new "subdomainAuthAllowed" ACME directory This document defines a new subdomainAuthAllowed ACME directory
metadata field. An ACME server can advertise support for metadata field. An ACME server can advertise support for
authorization of subdomains by including the "subdomainAuthAllowed" authorization of subdomains by including the subdomainAuthAllowed
boolean flag in its "ACME Directory Metadata Fields" registry: boolean flag in its "ACME Directory Metadata Fields" registry:
subdomainAuthAllowed (optional, bool): Indicates if an ACME server subdomainAuthAllowed (optional, bool): Indicates if an ACME server
supports authorization of subdomains. supports authorization of subdomains.
If not specified, then the assumed default value is false. If an If not specified, then the assumed default value is false. If an
ACME server supports authorization of subdomains, it can indicate ACME server supports authorization of subdomains, it can indicate
this by including this field with a value of "true". this by including this field with a value of "true".
5. Illustrative Call Flow 5. Illustrative Call Flow
skipping to change at line 558 skipping to change at line 556
| POST /certificate | | | POST /certificate | |
|--------------------------->| | |--------------------------->| |
| | | | | |
| 200 OK | | | 200 OK | |
| PEM SAN "sub2.example.org" | | | PEM SAN "sub2.example.org" | |
|<---------------------------| | |<---------------------------| |
* Step 1: Pre-authorization of ancestor domain. * Step 1: Pre-authorization of ancestor domain.
The client sends a newAuthz request for the ancestor domain and The client sends a newAuthz request for the ancestor domain and
includes the "subdomainAuthAllowed" flag in the identifier object. includes the subdomainAuthAllowed flag in the identifier object.
POST /acme/new-authz HTTP/1.1 POST /acme/new-authz HTTP/1.1
Host: example.com Host: example.com
Content-Type: application/jose+json Content-Type: application/jose+json
{ {
"protected": base64url({ "protected": base64url({
"alg": "ES256", "alg": "ES256",
"kid": "https://example.com/acme/acct/evOfKhNU60wg", "kid": "https://example.com/acme/acct/evOfKhNU60wg",
"nonce": "uQpSjlRb4vQVCjVYAyyUWg", "nonce": "uQpSjlRb4vQVCjVYAyyUWg",
skipping to change at line 582 skipping to change at line 580
"identifier": { "identifier": {
"type": "dns", "type": "dns",
"value": "example.org", "value": "example.org",
"subdomainAuthAllowed": true "subdomainAuthAllowed": true
} }
}), }),
"signature": "nuSDISbWG8mMgE7H...QyVUL68yzf3Zawps" "signature": "nuSDISbWG8mMgE7H...QyVUL68yzf3Zawps"
} }
The server creates and returns an authorization object for the The server creates and returns an authorization object for the
identifier that includes the "subdomainAuthAllowed" flag. The identifier that includes the subdomainAuthAllowed flag. The
object is initially in "pending" state. object is initially in "pending" state.
{ {
"status": "pending", "status": "pending",
"expires": "2023-09-01T14:09:07.99Z", "expires": "2023-09-01T14:09:07.99Z",
"identifier": { "identifier": {
"type": "dns", "type": "dns",
"value": "example.org" "value": "example.org"
}, },
skipping to change at line 630 skipping to change at line 628
the client's challenge immediately with a status of "processing" the client's challenge immediately with a status of "processing"
and the client will then need to poll the authorization resource and the client will then need to poll the authorization resource
to see when it is finalized. Refer to Section 7.5.1 of [RFC8555] to see when it is finalized. Refer to Section 7.5.1 of [RFC8555]
for more details. for more details.
* Step 2: The client places a newOrder for sub1.example.org. * Step 2: The client places a newOrder for sub1.example.org.
The client sends a newOrder request to the server and includes the The client sends a newOrder request to the server and includes the
subdomain identifier. Note that the identifier is a subdomain of subdomain identifier. Note that the identifier is a subdomain of
the ancestor domain that has been pre-authorized in Step 1. The the ancestor domain that has been pre-authorized in Step 1. The
client does not need to include the "subdomainAuthAllowed" field client does not need to include the subdomainAuthAllowed field in
in the "identifier" object, as it has already pre-authorized the the identifier object, as it has already pre-authorized the
ancestor domain. ancestor domain.
POST /acme/new-order HTTP/1.1 POST /acme/new-order HTTP/1.1
Host: example.com Host: example.com
Content-Type: application/jose+json Content-Type: application/jose+json
{ {
"protected": base64url({ "protected": base64url({
"alg": "ES256", "alg": "ES256",
"kid": "https://example.com/acme/acct/evOfKhNU60wg", "kid": "https://example.com/acme/acct/evOfKhNU60wg",
skipping to change at line 683 skipping to change at line 681
], ],
"authorizations": [ "authorizations": [
"https://example.com/acme/authz/PAniVnsZcis" "https://example.com/acme/authz/PAniVnsZcis"
], ],
"finalize": "https://example.com/acme/order/TOlocrfgo/finalize" "finalize": "https://example.com/acme/order/TOlocrfgo/finalize"
} }
The client can proceed to finalize the order by posting a CSR to The client can proceed to finalize the order by posting a CSR to
the "finalize" resource. The client can then download the the finalize resource. The client can then download the
certificate for sub1.example.org. certificate for sub1.example.org.
* Step 3: The client places a newOrder for sub2.example.org. * Step 3: The client places a newOrder for sub2.example.org.
The client sends a newOrder request to the server and includes the The client sends a newOrder request to the server and includes the
subdomain identifier. Note that the identifier is a subdomain of subdomain identifier. Note that the identifier is a subdomain of
the ancestor domain that has been pre-authorized in Step 1. The the ancestor domain that has been pre-authorized in Step 1. The
client does not need to include the "subdomainAuthAllowed" field client does not need to include the subdomainAuthAllowed field in
in the "identifier" object, as it has already pre-authorized the the identifier object, as it has already pre-authorized the
ancestor domain. ancestor domain.
POST /acme/new-order HTTP/1.1 POST /acme/new-order HTTP/1.1
Host: example.com Host: example.com
Content-Type: application/jose+json Content-Type: application/jose+json
{ {
"protected": base64url({ "protected": base64url({
"alg": "ES256", "alg": "ES256",
"kid": "https://example.com/acme/acct/evOfKhNU60wg", "kid": "https://example.com/acme/acct/evOfKhNU60wg",
skipping to change at line 744 skipping to change at line 742
], ],
"authorizations": [ "authorizations": [
"https://example.com/acme/authz/PAniVnsZcis" "https://example.com/acme/authz/PAniVnsZcis"
], ],
"finalize": "https://example.com/acme/order/ROni7rdde/finalize" "finalize": "https://example.com/acme/order/ROni7rdde/finalize"
} }
The client can proceed to finalize the order by posting a CSR to The client can proceed to finalize the order by posting a CSR to
the "finalize" resource. The client can then download the the finalize resource. The client can then download the
certificate for sub2.example.org. certificate for sub2.example.org.
6. IANA Considerations 6. IANA Considerations
6.1. Authorization Object Fields Registry 6.1. Authorization Object Fields Registry
The following field has been added to the "ACME Authorization Object The following field has been added to the "ACME Authorization Object
Fields" registry defined in ACME [RFC8555]. Fields" registry defined in ACME [RFC8555].
+======================+============+==============+===========+ +======================+============+==============+===========+
 End of changes. 46 change blocks. 
78 lines changed or deleted 76 lines changed or added

This html diff was produced by rfcdiff 1.48.