| rfc9444.original | rfc9444.txt | |||
|---|---|---|---|---|
| ACME Working Group O. Friel | Internet Engineering Task Force (IETF) O. Friel | |||
| Internet-Draft R. Barnes | Request for Comments: 9444 R. Barnes | |||
| Intended status: Standards Track Cisco | Category: Standards Track Cisco | |||
| Expires: 2 September 2023 T. Hollebeek | ISSN: 2070-1721 T. Hollebeek | |||
| DigiCert | DigiCert | |||
| M. Richardson | M. Richardson | |||
| Sandelman Software Works | Sandelman Software Works | |||
| 1 March 2023 | August 2023 | |||
| Automated Certificate Management Environment (ACME) for Subdomains | Automated Certificate Management Environment (ACME) for Subdomains | |||
| draft-ietf-acme-subdomains-07 | ||||
| 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. This | for a subdomain identifier from a certification authority. | |||
| document specifies how a client can fulfill a challenge against an | Additionally, this document specifies how a client can fulfill a | |||
| ancestor domain but may not need to fulfill a challenge against the | challenge against an ancestor domain but may not need to fulfill a | |||
| explicit subdomain if certification authority policy allows issuance | challenge against the explicit subdomain if certification authority | |||
| of the subdomain certificate without explicit subdomain ownership | policy allows issuance of the subdomain certificate without explicit | |||
| proof. | subdomain ownership proof. | |||
| Status of This Memo | Status of This Memo | |||
| This Internet-Draft is submitted in full conformance with the | This is an Internet Standards Track document. | |||
| provisions of BCP 78 and BCP 79. | ||||
| Internet-Drafts are working documents of the Internet Engineering | ||||
| Task Force (IETF). Note that other groups may also distribute | ||||
| working documents as Internet-Drafts. The list of current Internet- | ||||
| Drafts is at https://datatracker.ietf.org/drafts/current/. | ||||
| Internet-Drafts are draft documents valid for a maximum of six months | This document is a product of the Internet Engineering Task Force | |||
| and may be updated, replaced, or obsoleted by other documents at any | (IETF). It represents the consensus of the IETF community. It has | |||
| time. It is inappropriate to use Internet-Drafts as reference | received public review and has been approved for publication by the | |||
| material or to cite them other than as "work in progress." | Internet Engineering Steering Group (IESG). Further information on | |||
| Internet Standards is available in Section 2 of RFC 7841. | ||||
| This Internet-Draft will expire on 2 September 2023. | Information about the current status of this document, any errata, | |||
| and how to provide feedback on it may be obtained at | ||||
| https://www.rfc-editor.org/info/rfc9444. | ||||
| Copyright Notice | Copyright Notice | |||
| Copyright (c) 2023 IETF Trust and the persons identified as the | Copyright (c) 2023 IETF Trust and the persons identified as the | |||
| document authors. All rights reserved. | document authors. All rights reserved. | |||
| This document is subject to BCP 78 and the IETF Trust's Legal | This document is subject to BCP 78 and the IETF Trust's Legal | |||
| Provisions Relating to IETF Documents (https://trustee.ietf.org/ | Provisions Relating to IETF Documents | |||
| license-info) in effect on the date of publication of this document. | (https://trustee.ietf.org/license-info) in effect on the date of | |||
| Please review these documents carefully, as they describe your rights | publication of this document. Please review these documents | |||
| and restrictions with respect to this document. Code Components | carefully, as they describe your rights and restrictions with respect | |||
| extracted from this document must include Revised BSD License text as | to this document. Code Components extracted from this document must | |||
| described in Section 4.e of the Trust Legal Provisions and are | include Revised BSD License text as described in Section 4.e of the | |||
| provided without warranty as described in the Revised BSD License. | Trust Legal Provisions and are provided without warranty as described | |||
| in the Revised BSD License. | ||||
| Table of Contents | Table of Contents | |||
| 1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . 2 | 1. Introduction | |||
| 2. Terminology . . . . . . . . . . . . . . . . . . . . . . . . . 3 | 2. Terminology | |||
| 3. ACME Workflow and Identifier Requirements . . . . . . . . . . 5 | 3. ACME Workflow and Identifier Requirements | |||
| 4. ACME Issuance of Subdomain Certificates . . . . . . . . . . . 6 | 4. ACME Issuance of Subdomain Certificates | |||
| 4.1. Authorization Object . . . . . . . . . . . . . . . . . . 7 | 4.1. Authorization Object | |||
| 4.2. Pre-Authorization . . . . . . . . . . . . . . . . . . . . 8 | 4.2. Pre-authorization | |||
| 4.3. New Orders . . . . . . . . . . . . . . . . . . . . . . . 9 | 4.3. New Orders | |||
| 4.4. Directory Object Metadata . . . . . . . . . . . . . . . . 11 | 4.4. Directory Object Metadata | |||
| 5. Illustrative Call Flow . . . . . . . . . . . . . . . . . . . 11 | 5. Illustrative Call Flow | |||
| 6. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 17 | 6. IANA Considerations | |||
| 6.1. Authorization Object Fields Registry . . . . . . . . . . 17 | 6.1. Authorization Object Fields Registry | |||
| 6.2. Directory Object Metadata Fields Registry . . . . . . . . 17 | 6.2. Directory Object Metadata Fields Registry | |||
| 7. Security Considerations . . . . . . . . . . . . . . . . . . . 18 | 7. Security Considerations | |||
| 7.1. Client Account Security . . . . . . . . . . . . . . . . . 19 | 7.1. Client Account Security | |||
| 7.2. Subdomain Determination . . . . . . . . . . . . . . . . . 19 | 7.2. Subdomain Determination | |||
| 7.3. ACME Server Policy Considerations . . . . . . . . . . . . 19 | 7.3. ACME Server Policy Considerations | |||
| 8. References . . . . . . . . . . . . . . . . . . . . . . . . . 20 | 8. References | |||
| 8.1. Normative References . . . . . . . . . . . . . . . . . . 20 | 8.1. Normative References | |||
| 8.2. Informative References . . . . . . . . . . . . . . . . . 21 | 8.2. Informative References | |||
| Authors' Addresses . . . . . . . . . . . . . . . . . . . . . . . 22 | Authors' Addresses | |||
| 1. Introduction | 1. Introduction | |||
| ACME [RFC8555] defines a protocol that a certification authority (CA) | ACME [RFC8555] defines a protocol that a certification authority (CA) | |||
| and an applicant can use to automate the process of domain name | and an applicant can use to automate the process of domain name | |||
| ownership validation and X.509v3 (PKIX) [RFC5280] certificate | ownership validation and X.509v3 (PKIX) [RFC5280] certificate | |||
| issuance. The CA is the ACME server and the applicant is the ACME | issuance. The CA is the ACME server and the applicant is the ACME | |||
| client, and the client uses the ACME protocol to request certificate | client, and the client uses the ACME protocol to request certificate | |||
| issuance from the server. This document outlines how ACME can be | issuance from the server. This document outlines how ACME can be | |||
| used to issue subdomain certificates, without requiring the ACME | used to issue subdomain certificates without requiring the ACME | |||
| client to explicitly fulfill an ownership challenge against the | client to explicitly fulfill an ownership challenge against the | |||
| subdomain identifiers - the ACME client need only fulfill an | subdomain identifiers -- the ACME client need only fulfill an | |||
| ownership challenge against an ancestor domain identifier. | ownership challenge against an ancestor domain identifier. | |||
| 2. Terminology | 2. Terminology | |||
| The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", | The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", | |||
| "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", and | "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", and | |||
| "OPTIONAL" in this document are to be interpreted as described in | "OPTIONAL" in this document are to be interpreted as described in | |||
| BCP 14 [RFC2119] [RFC8174] when, and only when, they appear in all | BCP 14 [RFC2119] [RFC8174] when, and only when, they appear in all | |||
| capitals, as shown here. | capitals, as shown here. | |||
| The following terms are defined in DNS Terminology [RFC8499] and are | The following terms are defined in "DNS Terminology" [RFC8499] and | |||
| reproduced here: | are reproduced here: | |||
| * Label: An ordered list of zero or more octets that makes up a | Label: | |||
| portion of a domain name. Using graph theory, a label identifies | An ordered list of zero or more octets that makes up a portion of | |||
| one node in a portion of the graph of all possible domain names. | a domain name. Using graph theory, a label identifies one node in | |||
| a portion of the graph of all possible domain names. | ||||
| * Domain Name: An ordered list of one or more labels. | Domain Name: | |||
| An ordered list of one or more labels. | ||||
| * Fully-Qualified Domain Name (FQDN): This is often just a clear way | Fully-Qualified Domain Name (FQDN): | |||
| of saying the same thing as "domain name of a node", as outlined | This is often just a clear way of saying the same thing as "domain | |||
| above. However, the term is ambiguous. Strictly speaking, a | name of a node", as outlined above. However, the term is | |||
| fully-qualified domain name would include every label, including | ambiguous. Strictly speaking, a fully-qualified domain name would | |||
| the zero-length label of the root: such a name would be written | include every label, including the zero-length label of the root: | |||
| "www.example.net." (note the terminating dot). But, because every | such a name would be written www.example.net. (note the | |||
| name eventually shares the common root, names are often written | terminating dot). But, because every name eventually shares the | |||
| relative to the root (such as "www.example.net") and are still | common root, names are often written relative to the root (such as | |||
| called "fully qualified". This term first appeared in [RFC0819]. | www.example.net) and are still called "fully qualified". This | |||
| In this document, names are often written relative to the root. | term first appeared in [RFC0819]. In this document, names are | |||
| 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 is | Terminology" [RFC8499] and reproduced here; however, the definition | |||
| ambiguous and is further clarified below: | is ambiguous and is further clarified below: | |||
| * Subdomain: "A domain is a subdomain of another domain if it is | Subdomain: | |||
| contained within that domain. This relationship can be tested by | "A domain is a subdomain of another domain if it is contained | |||
| seeing if the subdomain's name ends with the containing domain's | within that domain. This relationship can be tested by seeing if | |||
| name." (Quoted from Section 3.1 of [RFC1034].) For example, in | the subdomain's name ends with the containing domain's name." | |||
| the host name "nnn.mmm.example.com", both "mmm.example.com" and | (Quoted from Section 3.1 of [RFC1034].) For example, in the host | |||
| "nnn.mmm.example.com" are subdomains of "example.com". Note that | name nnn.mmm.example.com, both mmm.example.com and | |||
| the comparisons here are done on whole labels; that is, | nnn.mmm.example.com are subdomains of example.com. Note that the | |||
| "ooo.example.com" is not a subdomain of "oo.example.com". | comparisons here are done on whole labels; that is, | |||
| 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): An organization that is responsible | Certification Authority (CA): | |||
| for the creation, issuance, revocation, and management of | An organization that is responsible for the creation, issuance, | |||
| Certificates. The term applies equally to both Root CAs and | revocation, and management of Certificates. The term applies | |||
| Subordinate CAs. Refer to [RFC5280] for detailed information on | equally to both root CAs and subordinate CAs. Refer to [RFC5280] | |||
| Certification Authorities. | for detailed information on Certification Authorities. | |||
| * CSR: Certificate Signing Request as defined in [RFC2986] | CSR: | |||
| Certificate Signing Request, as defined in [RFC2986]. | ||||
| * Ancestor Domain: a domain is an ancestor domain of a subdomain if | Ancestor Domain: | |||
| it contains that subdomain and has less labels than that | A domain is an ancestor domain of a subdomain if it contains that | |||
| subdomain. A domain cannot be an ancestor domain of itself. For | subdomain and has less labels than that subdomain. A domain | |||
| example, for the host name "nnn.mmm.example.com", both | cannot be an ancestor domain of itself. For example, for the host | |||
| "mmm.example.com" and "example.com" are ancestor domains of | name nnn.mmm.example.com, both mmm.example.com and example.com are | |||
| "nnn.mmm.example.com". However, "nnn.mmm.example.com" is not an | ancestor domains of nnn.mmm.example.com. However, | |||
| ancestor domain of "nnn.mmm.example.com". Note that the | nnn.mmm.example.com is not an ancestor domain of | |||
| comparisons here are done on whole labels; that is, | nnn.mmm.example.com. Note that the comparisons here are done on | |||
| "oo.example.com" is not an ancestor domain of "ooo.example.com". | whole labels; that is, oo.example.com is not an ancestor domain of | |||
| ooo.example.com. | ||||
| ACME [RFC8555] defines the following object types which are used in | [RFC8555] defines the following object types that are used in this | |||
| this document: | document: | |||
| * Order Object: An ACME order object represents a client's request | Order Object: An ACME order object represents a client's request for | |||
| 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. | |||
| * Challenge Object: An ACME challenge object represents a server's | Challenge Object: An ACME challenge object represents a server's | |||
| offer to validate a client's possession of an identifier in a | offer to validate a client's possession of an identifier in a | |||
| specific way. | specific way. | |||
| ACME [RFC8555] Section 6.3 introduces the following term which is | ACME [RFC8555], Section 6.3 introduces the following term which is | |||
| used in this document: | used in this document: | |||
| * POST-as-GET Request: When a client wishes to fetch a resource from | POST-as-GET Request: | |||
| the server, then it MUST send a POST request with a signed JWS | When a client wishes to fetch a resource from the server, then it | |||
| body, where the JWS body is specified in ACME [RFC8555] | MUST send a POST request with a signed JSON Web Signature (JWS) | |||
| 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 [RFC8555] workflow for issuance of certificates is as | A typical ACME workflow for issuance of certificates is as follows: | |||
| 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 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 dictated | * [RFC8555], Section 7.1.3: "The authorizations required are | |||
| by server policy; there may not be a 1:1 relationship between the | dictated by server policy; there may not be a 1:1 relationship | |||
| 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 base ACME [RFC8555] document 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 also that ACME supports multiple different validation methods | Note that ACME supports multiple different validation methods that | |||
| that can be used to fulfill challenges and prove ownership of | can be used to fulfill challenges and prove ownership of identifiers. | |||
| 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 | MUST be true for authorizations where ACME server policy allows | |||
| allows certificates to be issued for any subdomain subordinate | certificates to be issued for any subdomain subordinate to the | |||
| to the domain specified in the 'identifier' field of the | domain specified in the identifier field of the authorization | |||
| 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 subordinate | example.org, where the authorization covers the subdomains | |||
| 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", | |||
| "identifier": { | "identifier": { | |||
| "type": "dns", | "type": "dns", | |||
| "value": "example.org" | "value": "example.org" | |||
| }, | }, | |||
| "challenges": [ | "challenges": [ | |||
| { | { | |||
| "url": "https://example.com/acme/chall/prV_B7yEyA4", | "url": "https://example.com/acme/chall/prV_B7yEyA4", | |||
| "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 | subdomainAuthAllowed (optional, boolean): An ACME client sets this | |||
| 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 | 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 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 | authorization object for the indicated identifier and MAY include the | |||
| the "subdomainAuthAllowed" flag with 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 | ancestorDomain (optional, string): This is an ancestor domain of the | |||
| the requested identifier. The client MUST be able to fulfill | requested identifier. The client MUST be able to fulfill a | |||
| 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 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": [ | |||
| { "type": "dns", | { "type": "dns", | |||
| "value": "foo.bar.example.org", | "value": "foo.bar.example.org", | |||
| "ancestorDomain": "bar.example.org" } | "ancestorDomain": "bar.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" | |||
| }) | }) | |||
| In the following example 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 example.org. The | can fulfill a challenge against the ancestor domain example.org. The | |||
| server can then choose to issue a challenge against any one of | server can then choose to issue a challenge against any one of | |||
| foo.bar.example.org, bar.example.org or example.org identifiers. | foo.bar.example.org, bar.example.org, or example.org identifiers. | |||
| "payload": base64url({ | "payload": base64url({ | |||
| "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 | subdomainAuthAllowed (optional, bool): Indicates if an ACME server | |||
| 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 | |||
| The call flow illustrated here uses the ACME pre-authorization flow | The call flow illustrated here uses the ACME pre-authorization flow | |||
| using DNS-based proof of ownership. | using DNS-based proof of ownership. | |||
| +--------+ +------+ +-----+ | +--------+ +------+ +-----+ | |||
| | Client | | ACME | | DNS | | | Client | | ACME | | DNS | | |||
| +--------+ +------+ +-----+ | +--------+ +------+ +-----+ | |||
| | | | | | | | | |||
| STEP 1: Pre-Authorization of ancestor domain | Step 1: Pre-authorization of ancestor domain. | |||
| | | | | | | | | |||
| | POST /newAuthz | | | | POST /newAuthz | | | |||
| | "example.org" | | | | "example.org" | | | |||
| |--------------------------->| | | |--------------------------->| | | |||
| | | | | | | | | |||
| | 201 authorizations | | | | 201 authorizations | | | |||
| |<---------------------------| | | |<---------------------------| | | |||
| | | | | | | | | |||
| | Publish DNS TXT | | | | Publish DNS TXT | | | |||
| | "example.org" | | | | "example.org" | | | |||
| skipping to change at page 12, line 12 ¶ | skipping to change at line 507 ¶ | |||
| |--------------------------->| | | |--------------------------->| | | |||
| | | Verify | | | | Verify | | |||
| | |---------->| | | |---------->| | |||
| | 200 status=valid | | | | 200 status=valid | | | |||
| |<---------------------------| | | |<---------------------------| | | |||
| | | | | | | | | |||
| | Delete DNS TXT | | | | Delete DNS TXT | | | |||
| | "example.org" | | | | "example.org" | | | |||
| |--------------------------------------->| | |--------------------------------------->| | |||
| | | | | | | | | |||
| STEP 2: Place order for sub1.example.org | Step 2: Place order for sub1.example.org. | |||
| | | | | | | | | |||
| | POST /newOrder | | | | POST /newOrder | | | |||
| | "sub1.example.org" | | | | "sub1.example.org" | | | |||
| |--------------------------->| | | |--------------------------->| | | |||
| | | | | | | | | |||
| | 201 status=ready | | | | 201 status=ready | | | |||
| |<---------------------------| | | |<---------------------------| | | |||
| | | | | | | | | |||
| | POST /finalize | | | | POST /finalize | | | |||
| | CSR SAN "sub1.example.org" | | | | CSR SAN "sub1.example.org" | | | |||
| skipping to change at page 12, line 35 ¶ | skipping to change at line 530 ¶ | |||
| | 200 OK status=valid | | | | 200 OK status=valid | | | |||
| |<---------------------------| | | |<---------------------------| | | |||
| | | | | | | | | |||
| | POST /certificate | | | | POST /certificate | | | |||
| |--------------------------->| | | |--------------------------->| | | |||
| | | | | | | | | |||
| | 200 OK | | | | 200 OK | | | |||
| | PEM SAN "sub1.example.org" | | | | PEM SAN "sub1.example.org" | | | |||
| |<---------------------------| | | |<---------------------------| | | |||
| | | | | | | | | |||
| STEP 3: Place order for sub2.example.org | Step 3: Place order for sub2.example.org. | |||
| | | | | | | | | |||
| | POST /newOrder | | | | POST /newOrder | | | |||
| | "sub2.example.org" | | | | "sub2.example.org" | | | |||
| |--------------------------->| | | |--------------------------->| | | |||
| | | | | | | | | |||
| | 201 status=ready | | | | 201 status=ready | | | |||
| |<---------------------------| | | |<---------------------------| | | |||
| | | | | | | | | |||
| | POST /finalize | | | | POST /finalize | | | |||
| | CSR SAN "sub2.example.org" | | | | CSR SAN "sub2.example.org" | | | |||
| skipping to change at page 13, line 10 ¶ | skipping to change at line 553 ¶ | |||
| | 200 OK status=valid | | | | 200 OK status=valid | | | |||
| |<---------------------------| | | |<---------------------------| | | |||
| | | | | | | | | |||
| | 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 | The client sends a newAuthz request for the ancestor domain and | |||
| including the "subdomainAuthAllowed" flag in the identifier | includes the subdomainAuthAllowed flag in the identifier object. | |||
| 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 page 13, line 37 ¶ | skipping to change at line 579 ¶ | |||
| "payload": base64url({ | "payload": base64url({ | |||
| "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 including the "subdomainAuthAllowed" flag. The object is | identifier that includes the subdomainAuthAllowed flag. The | |||
| 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 page 14, line 27 ¶ | skipping to change at line 605 ¶ | |||
| "type": "dns-01", | "type": "dns-01", | |||
| "status": "pending", | "status": "pending", | |||
| "token": "DGyRejmCefe7v4NfDGDKfA", | "token": "DGyRejmCefe7v4NfDGDKfA", | |||
| "validated": "2023-08-01T12:05:58.16Z" | "validated": "2023-08-01T12:05:58.16Z" | |||
| } | } | |||
| ], | ], | |||
| "subdomainAuthAllowed": true | "subdomainAuthAllowed": true | |||
| } | } | |||
| The example illustrates the client completing a DNS challenge by | The example illustrates the client completing a DNS challenge by | |||
| publishing a DNS TXT record. The client then posts to the challenge | publishing a DNS TXT record. The client then posts to the | |||
| resource to inform the server that it can validate the challenge. | challenge resource to inform the server that it can validate the | |||
| challenge. | ||||
| Once the server validates the challenge by checking the DNS TXT | Once the server validates the challenge by checking the DNS TXT | |||
| record, the server will transition the authorization object and | record, the server will transition the authorization object and | |||
| associated challenge object status to "valid". | associated challenge object status to "valid". | |||
| The call flow above illustrates the ACME server replying to the | The call flow above illustrates the ACME server replying to the | |||
| client's challenge with status of "valid" after the ACME server has | client's challenge with status of "valid" after the ACME server | |||
| validated the DNS challenge. However, the validation flow may take | has validated the DNS challenge. However, the validation flow may | |||
| some time. If this is the case, the ACME server may reply to the | take some time. If this is the case, the ACME server may reply to | |||
| client's challenge immediately with a status of "processing", and the | the client's challenge immediately with a status of "processing" | |||
| client will then need to poll the authorization resource to see when | and the client will then need to poll the authorization resource | |||
| it is finalized. Refer to ACME [RFC8555], Section 7.5.1 for more | to see when it is finalized. Refer to Section 7.5.1 of [RFC8555] | |||
| 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 page 15, line 26 ¶ | skipping to change at line 653 ¶ | |||
| "payload": base64url({ | "payload": base64url({ | |||
| "identifiers": [ | "identifiers": [ | |||
| { "type": "dns", "value": "sub1.example.org" } | { "type": "dns", "value": "sub1.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" | |||
| }), | }), | |||
| "signature": "H6ZXtGjTZyUnPeKn...wEA4TklBdh3e454g" | "signature": "H6ZXtGjTZyUnPeKn...wEA4TklBdh3e454g" | |||
| } | } | |||
| As an authorization object already exists for the ancestor domain, | As an authorization object already exists for the ancestor domain, | |||
| the server replies with an order object with a status of "ready" that | the server replies with an order object with a status of "ready" | |||
| includes a link to the existing "valid" authorization object. | that includes a link to the existing "valid" authorization object. | |||
| HTTP/1.1 201 Created | HTTP/1.1 201 Created | |||
| Replay-Nonce: MYAuvOpaoIiywTezizk5vw | Replay-Nonce: MYAuvOpaoIiywTezizk5vw | |||
| Link: <https://example.com/acme/directory>;rel="index" | Link: <https://example.com/acme/directory>;rel="index" | |||
| Location: https://example.com/acme/order/TOlocE8rfgo | Location: https://example.com/acme/order/TOlocE8rfgo | |||
| { | { | |||
| "status": "ready", | "status": "ready", | |||
| "expires": "2023-09-01T14:09:07.99Z", | "expires": "2023-09-01T14:09:07.99Z", | |||
| skipping to change at page 16, line 5 ¶ | skipping to change at line 680 ¶ | |||
| { "type": "dns", "value": "sub1.example.org" } | { "type": "dns", "value": "sub1.example.org" } | |||
| ], | ], | |||
| "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 | The client can proceed to finalize the order by posting a CSR to | |||
| "finalize" resource. The client can then download the certificate | the finalize resource. The client can then download the | |||
| 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 page 16, line 39 ¶ | skipping to change at line 714 ¶ | |||
| "payload": base64url({ | "payload": base64url({ | |||
| "identifiers": [ | "identifiers": [ | |||
| { "type": "dns", "value": "sub2.example.org" } | { "type": "dns", "value": "sub2.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" | |||
| }), | }), | |||
| "signature": "H6ZXtGjTZyUnPeKn...wEA4TklBdh3e454g" | "signature": "H6ZXtGjTZyUnPeKn...wEA4TklBdh3e454g" | |||
| } | } | |||
| As an authorization object already exists for the ancestor domain, | As an authorization object already exists for the ancestor domain, | |||
| the server replies with an order object with a status of "ready" that | the server replies with an order object with a status of "ready" | |||
| includes a link to the existing "valid" authorization object. | that includes a link to the existing "valid" authorization object. | |||
| HTTP/1.1 201 Created | HTTP/1.1 201 Created | |||
| Replay-Nonce: MYAuvOpaoIiywTezizk5vw | Replay-Nonce: MYAuvOpaoIiywTezizk5vw | |||
| Link: <https://example.com/acme/directory>;rel="index" | Link: <https://example.com/acme/directory>;rel="index" | |||
| Location: https://example.com/acme/order/TOlocE8rfgo | Location: https://example.com/acme/order/TOlocE8rfgo | |||
| { | { | |||
| "status": "ready", | "status": "ready", | |||
| "expires": "2023-09-01T14:09:07.99Z", | "expires": "2023-09-01T14:09:07.99Z", | |||
| skipping to change at page 17, line 28 ¶ | skipping to change at line 741 ¶ | |||
| { "type": "dns", "value": "sub2.example.org" } | { "type": "dns", "value": "sub2.example.org" } | |||
| ], | ], | |||
| "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 | The client can proceed to finalize the order by posting a CSR to | |||
| "finalize" resource. The client can then download the certificate | the finalize resource. The client can then download the | |||
| 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 is 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]. | |||
| +----------------------+------------+--------------+-----------+ | +======================+============+==============+===========+ | |||
| | Field Name | Field Type | Configurable | Reference | | | Field Name | Field Type | Configurable | Reference | | |||
| +----------------------+------------+--------------+-----------+ | +======================+============+==============+===========+ | |||
| | subdomainAuthAllowed | boolean | false | RFC XXXX | | | subdomainAuthAllowed | boolean | false | RFC 9444 | | |||
| +----------------------+------------+--------------+-----------+ | +----------------------+------------+--------------+-----------+ | |||
| Table 1 | ||||
| 6.2. Directory Object Metadata Fields Registry | 6.2. Directory Object Metadata Fields Registry | |||
| The following field is added to the "ACME Directory Metadata Fields" | The following field has been added to the "ACME Directory Metadata | |||
| registry defined in ACME [RFC8555]. | Fields" registry defined in [RFC8555]. | |||
| +----------------------+------------+-----------+ | +======================+============+===========+ | |||
| | Field Name | Field Type | Reference | | | Field Name | Field Type | Reference | | |||
| +----------------------+------------+-----------+ | +======================+============+===========+ | |||
| | subdomainAuthAllowed | boolean | RFC XXXX | | | subdomainAuthAllowed | boolean | RFC 9444 | | |||
| +----------------------+------------+-----------+ | +----------------------+------------+-----------+ | |||
| Table 2 | ||||
| 7. Security Considerations | 7. Security Considerations | |||
| This document specifies enhancements to ACME [RFC8555] that optimize | This document specifies enhancements to ACME [RFC8555] that optimize | |||
| the protocol flows for issuance of certificates for subdomains. The | the protocol flows for issuance of certificates for subdomains. The | |||
| underlying goal of ACME for Subdomains remains the same as that of | underlying goal of ACME for Subdomains remains the same as that of | |||
| ACME: managing certificates that attest to identifier/key bindings | ACME: managing certificates that attest to identifier/key bindings | |||
| for these subdomains. Thus, ACME for Subdomains has the same two | for these subdomains. Thus, ACME for Subdomains has the same two | |||
| security goals as ACME: | security goals as ACME: | |||
| 1. Only an entity that controls an identifier can get an | (1) Only an entity that controls an identifier can get an | |||
| authorization for that identifier | authorization for that identifier. | |||
| 2. Once authorized, an account key's authorizations cannot be | (2) Once authorized, an account key's authorizations cannot be | |||
| improperly used by another account | improperly used by another account. | |||
| ACME for Subdomains makes no changes to: | ACME for Subdomains makes no changes to: | |||
| * account or account key management | * account or account key management | |||
| * ACME channel establishment, security mechanisms or threat model | * ACME channel establishment, security mechanisms, or threat model | |||
| * Validation channel establishment, security mechanisms or threat | * validation channel establishment, security mechanisms, or threat | |||
| model | model | |||
| Therefore, all Security Considerations in ACME in the following areas | Therefore, all Security Considerations in ACME in the following areas | |||
| are equally applicable to ACME for Subdomains: | are equally applicable to ACME for Subdomains: | |||
| * Threat Model | * Threat Model | |||
| * Integrity of Authorizations | * Integrity of Authorizations | |||
| * Denial-of-Service Considerations | * Denial-of-Service Considerations | |||
| * Server-Side Request Forgery | * Server-Side Request Forgery | |||
| * CA Policy Considerations | * CA Policy Considerations | |||
| The only exception is that in order to satisfy goal (1) above, this | The only exception is that in order to satisfy goal (1) above, this | |||
| draft assumes that control over a domain may imply control over a | document assumes that control over a domain may imply control over a | |||
| subdomain, and therefore authorization for certificate issuance for | subdomain; therefore, authorization for certificate issuance for the | |||
| the former may imply authorization for certificate issuance for the | former may imply authorization for certificate issuance for the | |||
| latter. In many ecosystems, this is a safe assumption, especially | latter. In many ecosystems, this is a safe assumption, especially | |||
| because control over the domain can often be leveraged to | because control over the domain can often be leveraged to | |||
| successfully demonstrate control over subdomains anyway, for example | successfully demonstrate control over subdomains anyway, for example, | |||
| by temporarily modifying DNS for the subdomain to point to a server | by temporarily modifying DNS for the subdomain to point to a server | |||
| the ancestor domain owner controls, rendering the distinction moot. | the ancestor domain owner controls, rendering the distinction moot. | |||
| For example, the CA/Browser Forum Baseline Requirements may consider | For example, the CA/Browser Forum Baseline Requirements may consider | |||
| control of an ancestor domain sufficient for issuance of certificates | control of an ancestor domain sufficient for issuance of certificates | |||
| for subdomains, but only if specific processes and procedures are | for subdomains, but only if specific processes and procedures are | |||
| used for validating ownership of the ancestor domain. | used for validating ownership of the ancestor domain. | |||
| In ecosystems where control of an ancestor domain may not imply | In ecosystems where control of an ancestor domain may not imply | |||
| control over subdomains or authorization for issuance of certificates | control over subdomains or authorization for issuance of certificates | |||
| for subdomains, a more complicated threat analysis and server policy | for subdomains, a more complicated threat analysis and server policy | |||
| might be needed. | might be needed. | |||
| Some additional comments on ACME server policy are given later in | Some additional comments on ACME server policy are given later in | |||
| this section. | this section. | |||
| 7.1. Client Account Security | 7.1. Client Account Security | |||
| There may be scenarios were a client wishes to deactivate an | There may be scenarios were a client wishes to deactivate an | |||
| authorization object for an ancestor domain, or deactivate its | authorization object for an ancestor domain or deactivate its account | |||
| account completely. For example, a client may want to do this if an | completely. For example, a client may want to do this if an account | |||
| account key is compromised, or if a authorization object covering | key is compromised or if an authorization object covering domains | |||
| domains subordinate to an ancestor domain is no longer needed. The | subordinate to an ancestor domain is no longer needed. The client | |||
| client can deactivate an authorization using the mechanism specified | can deactivate an authorization using the mechanism specified in | |||
| in [RFC8555], Section 7.5.2 and can deactivate an account using the | [RFC8555], Section 7.5.2 and can deactivate an account using the | |||
| mechanism specified in [RFC8555], Section 7.3.6. | mechanism specified in [RFC8555], Section 7.3.6. | |||
| 7.2. Subdomain Determination | 7.2. Subdomain Determination | |||
| The [RFC8499] definition of a subdomain is reproduced in Section 2. | The [RFC8499] definition of a subdomain is reproduced in Section 2. | |||
| When comparing domains to determine if one is a subdomain of the | When comparing domains to determine if one is a subdomain of the | |||
| other, it is important to compare entire labels, and not rely on a | other, it is important to compare entire labels and not rely on a | |||
| string prefix match. Relying on string prefix matches may yield | string prefix match. Relying on string prefix matches may yield | |||
| incorrect results. | incorrect results. | |||
| 7.3. ACME Server Policy Considerations | 7.3. ACME Server Policy Considerations | |||
| The ACME for Subdomains and the ACME specifications do not mandate | The ACME for Subdomains and the ACME specifications do not mandate | |||
| any specific ACME server or CA policies, or any specific use cases | any specific ACME server or CA policies, or any specific use cases | |||
| for issuance of certificates. For example, an ACME server could be | for issuance of certificates. For example, an ACME server could be | |||
| used: | used: | |||
| * to issue Web PKI certificates where the ACME server must comply | * to issue Web PKI certificates where the ACME server must comply | |||
| with CA/Browser Forum [CAB] Baseline Requirements. | with CA/Browser Forum Baseline Requirements [CAB]. | |||
| * as a Private CA for issuance of certificates within an | * as a Private CA for issuance of certificates within an | |||
| organization. The organization could enforce whatever policies | organization. The organization could enforce whatever policies | |||
| they desire on the ACME server. | they desire on the ACME server. | |||
| * for issuance of IoT device certificates. There are currently no | * for issuance of Internet of Things (IoT) device certificates. | |||
| IoT device certificate policies that are generally enforced across | There are currently no IoT device certificate policies that are | |||
| the industry. Organizations issuing IoT device certificates can | generally enforced across the industry. Organizations issuing IoT | |||
| enforce whatever policies they desire on the ACME server. | device certificates can enforce whatever policies they desire on | |||
| the ACME server. | ||||
| ACME server policy could specify whether: | ACME server policy could specify whether: | |||
| * issuance of subdomain certificates is allowed based on proof of | * issuance of subdomain certificates is allowed based on proof of | |||
| ownership of an ancestor domain | ownership of an ancestor domain. | |||
| * issuance of subdomain certificates is allowed, but only for a | * issuance of subdomain certificates is allowed, but only for a | |||
| specific set of ancestor domains | specific set of ancestor domains. | |||
| * DNS based proof of ownership, or HTTP based proof of ownership, or | * DNS-based or HTTP-based proof of ownership, or both, are allowed. | |||
| both, are allowed | ||||
| The CA policy considerations listed in [RFC8555], Section 10.5 are | The CA policy considerations listed in [RFC8555], Section 10.5 are | |||
| equally applicable here. These include, but are not limited to: | equally applicable here. These include, but are not limited to: | |||
| * Is the claimed identifier syntactically valid? | * Is the claimed identifier syntactically valid? | |||
| * For domain names: | * For domain names: | |||
| * Is the name on the Public Suffix List? | - Is the name on the Public Suffix List? | |||
| * Is the name a high-value name? | - Is the name a high-value name? | |||
| * Is the key in the CSR sufficiently strong? | * Is the key in the CSR sufficiently strong? | |||
| Refer to [RFC8555], Section 10.5 for more CA policy considerations. | Refer to [RFC8555], Section 10.5 for more CA policy considerations. | |||
| ACME server policy specification is explicitly out of scope of this | ACME server policy specification is explicitly out of scope of this | |||
| document. | document. | |||
| 8. References | 8. References | |||
| skipping to change at page 21, line 21 ¶ | skipping to change at line 924 ¶ | |||
| January 2019, <https://www.rfc-editor.org/info/rfc8499>. | January 2019, <https://www.rfc-editor.org/info/rfc8499>. | |||
| [RFC8555] Barnes, R., Hoffman-Andrews, J., McCarney, D., and J. | [RFC8555] Barnes, R., Hoffman-Andrews, J., McCarney, D., and J. | |||
| Kasten, "Automatic Certificate Management Environment | Kasten, "Automatic Certificate Management Environment | |||
| (ACME)", RFC 8555, DOI 10.17487/RFC8555, March 2019, | (ACME)", RFC 8555, DOI 10.17487/RFC8555, March 2019, | |||
| <https://www.rfc-editor.org/info/rfc8555>. | <https://www.rfc-editor.org/info/rfc8555>. | |||
| 8.2. Informative References | 8.2. Informative References | |||
| [ACME-Identifier-Types] | [ACME-Identifier-Types] | |||
| IANA, "ACME Identifier Types", n.d., | IANA, "ACME Identifier Types", | |||
| <https://www.iana.org/assignments/acme/acme.xhtml#acme- | <https://www.iana.org/assignments/acme/>. | |||
| identifier-types>. | ||||
| [ACME-Validation-Methods] | [ACME-Validation-Methods] | |||
| IANA, "ACME Validation Methods", n.d., | IANA, "ACME Validation Methods", | |||
| <https://www.iana.org/assignments/acme/acme.xhtml#acme- | <https://www.iana.org/assignments/acme/>. | |||
| validation-methods>. | ||||
| [CAB] CA/Browser Forum, "Baseline Requirements for the Issuance | [CAB] CA/Browser Forum, "Baseline Requirements for the Issuance | |||
| and Management of Publicly-Trusted Certificates", n.d., | and Management of Publicly-Trusted Certificates", | |||
| <https://cabforum.org/baseline-requirements-documents/>. | <https://cabforum.org/baseline-requirements-documents/>. | |||
| [RFC0819] Su, Z. and J. Postel, "The Domain Naming Convention for | [RFC0819] Su, Z. and J. Postel, "The Domain Naming Convention for | |||
| Internet User Applications", RFC 819, | Internet User Applications", RFC 819, | |||
| DOI 10.17487/RFC0819, August 1982, | DOI 10.17487/RFC0819, August 1982, | |||
| <https://www.rfc-editor.org/info/rfc819>. | <https://www.rfc-editor.org/info/rfc819>. | |||
| [RFC1034] Mockapetris, P., "Domain names - concepts and facilities", | [RFC1034] Mockapetris, P., "Domain names - concepts and facilities", | |||
| STD 13, RFC 1034, DOI 10.17487/RFC1034, November 1987, | STD 13, RFC 1034, DOI 10.17487/RFC1034, November 1987, | |||
| <https://www.rfc-editor.org/info/rfc1034>. | <https://www.rfc-editor.org/info/rfc1034>. | |||
| End of changes. 126 change blocks. | ||||
| 322 lines changed or deleted | 325 lines changed or added | |||
This html diff was produced by rfcdiff 1.48. | ||||