| rfc9444.original.xml | rfc9444.xml | |||
|---|---|---|---|---|
| <?xml version="1.0" encoding="utf-8"?> | <?xml version='1.0' encoding='utf-8'?> | |||
| <?xml-stylesheet type="text/xsl" href="rfc2629.xslt" ?> | <!DOCTYPE rfc [ | |||
| <!-- generated by https://github.com/cabo/kramdown-rfc version 1.6.10 (Ruby 2. | ||||
| 7.2) --> | ||||
| <!DOCTYPE rfc [ | ||||
| <!ENTITY nbsp " "> | <!ENTITY nbsp " "> | |||
| <!ENTITY zwsp "​"> | <!ENTITY zwsp "​"> | |||
| <!ENTITY nbhy "‑"> | <!ENTITY nbhy "‑"> | |||
| <!ENTITY wj "⁠"> | <!ENTITY wj "⁠"> | |||
| ]> | ]> | |||
| <rfc xmlns:xi="http://www.w3.org/2001/XInclude" ipr="trust200902" number="9444" | ||||
| <?rfc rfcedstyle="yes"?> | docName="draft-ietf-acme-subdomains-07" category="std" submissionType="IETF" con | |||
| <?rfc strict="yes"?> | sensus="true" tocDepth="2" tocInclude="true" sortRefs="true" symRefs="true" vers | |||
| <?rfc compact="no"?> | ion="3"> | |||
| <?rfc subcompact="no"?> | <!-- xml2rfc v2v3 conversion 3.17.1 --> | |||
| <?rfc comments="yes"?> | ||||
| <?rfc inline="yes"?> | ||||
| <rfc ipr="trust200902" docName="draft-ietf-acme-subdomains-07" category="std" co | ||||
| nsensus="yes" tocDepth="2" tocInclude="true" sortRefs="true" symRefs="true"> | ||||
| <front> | <front> | |||
| <title abbrev="ACME-SUBDOMAINS">Automated Certificate Management Environment | <title abbrev="ACME for Subdomains">Automated Certificate Management Environ | |||
| (ACME) for Subdomains</title> | ment (ACME) for Subdomains</title> | |||
| <seriesInfo name="RFC" value="9444"/> | ||||
| <author initials="O." surname="Friel" fullname="Owen Friel"> | <author initials="O." surname="Friel" fullname="Owen Friel"> | |||
| <organization>Cisco</organization> | <organization>Cisco</organization> | |||
| <address> | <address> | |||
| <email>ofriel@cisco.com</email> | <email>ofriel@cisco.com</email> | |||
| </address> | </address> | |||
| </author> | </author> | |||
| <author initials="R." surname="Barnes" fullname="Richard Barnes"> | <author initials="R." surname="Barnes" fullname="Richard Barnes"> | |||
| <organization>Cisco</organization> | <organization>Cisco</organization> | |||
| <address> | <address> | |||
| <email>rlb@ipv.sx</email> | <email>rlb@ipv.sx</email> | |||
| skipping to change at line 48 ¶ | skipping to change at line 37 ¶ | |||
| <address> | <address> | |||
| <email>tim.hollebeek@digicert.com</email> | <email>tim.hollebeek@digicert.com</email> | |||
| </address> | </address> | |||
| </author> | </author> | |||
| <author initials="M." surname="Richardson" fullname="Michael Richardson"> | <author initials="M." surname="Richardson" fullname="Michael Richardson"> | |||
| <organization>Sandelman Software Works</organization> | <organization>Sandelman Software Works</organization> | |||
| <address> | <address> | |||
| <email>mcr+ietf@sandelman.ca</email> | <email>mcr+ietf@sandelman.ca</email> | |||
| </address> | </address> | |||
| </author> | </author> | |||
| <date year="2023" month="August"/> | ||||
| <date year="2023" month="March" day="01"/> | ||||
| <area>Security</area> | <area>Security</area> | |||
| <workgroup>ACME Working Group</workgroup> | <workgroup>ACME Working Group</workgroup> | |||
| <keyword>BRSKI</keyword> | ||||
| <keyword>BRSKI-Cloud</keyword> | ||||
| <keyword>ACME-Integrations</keyword> | ||||
| <abstract> | <abstract> | |||
| <t>This document specifies how Automated Certificate Management Environmen | ||||
| <t>This document specifies how Automated Certificate Management Environment (ACM | t (ACME) can be used by a client to obtain a certificate for a subdomain identif | |||
| E) can be used by a client to obtain a certificate for a subdomain identifier fr | ier from a certification authority. Additionally, this document specifies how a | |||
| om a certification authority. This document specifies how a client can fulfill a | client can fulfill a challenge against an ancestor domain but may not need to fu | |||
| challenge against an ancestor domain but may not need to fulfill a challenge ag | lfill a challenge against the explicit subdomain if certification authority poli | |||
| ainst the explicit subdomain if certification authority policy allows issuance o | cy allows issuance of the subdomain certificate without explicit subdomain owner | |||
| f the subdomain certificate without explicit subdomain ownership proof.</t> | ship proof.</t> | |||
| </abstract> | </abstract> | |||
| </front> | </front> | |||
| <middle> | <middle> | |||
| <section anchor="introduction"> | ||||
| <section anchor="introduction"><name>Introduction</name> | <name>Introduction</name> | |||
| <t>ACME <xref target="RFC8555"/> defines a protocol that a certification a | ||||
| <t>ACME <xref target="RFC8555"/> defines a protocol that a certification authori | uthority (CA) and an applicant can use to automate the process of domain name ow | |||
| ty (CA) and an applicant can use to automate the process of domain name ownershi | nership validation and X.509v3 (PKIX) <xref target="RFC5280"/> certificate issua | |||
| p validation and X.509v3 (PKIX) <xref target="RFC5280"/> certificate issuance. T | nce. The CA is the ACME server and the applicant is the ACME client, and the cli | |||
| he CA is the ACME server and the applicant is the ACME client, and the client us | ent uses the ACME protocol to request certificate issuance from the server. This | |||
| es the ACME protocol to request certificate issuance from the server. This docum | document outlines how ACME can be used to issue subdomain certificates without | |||
| ent outlines how ACME can be used to issue subdomain certificates, without requi | requiring the ACME client to explicitly fulfill an ownership challenge against t | |||
| ring the ACME client to explicitly fulfill an ownership challenge against the su | he subdomain identifiers -- the ACME client need only fulfill an ownership chall | |||
| bdomain identifiers - the ACME client need only fulfill an ownership challenge a | enge against an ancestor domain identifier.</t> | |||
| gainst an ancestor domain identifier.</t> | </section> | |||
| <section anchor="terminology"> | ||||
| </section> | <name>Terminology</name> | |||
| <section anchor="terminology"><name>Terminology</name> | <t> | |||
| The key words "<bcp14>MUST</bcp14>", "<bcp14>MUST NOT</bcp14>", "<bcp14>REQU | ||||
| <t>The key words "<bcp14>MUST</bcp14>", "<bcp14>MUST NOT</bcp14>", "<bcp14>REQUI | IRED</bcp14>", "<bcp14>SHALL</bcp14>", "<bcp14>SHALL | |||
| RED</bcp14>", "<bcp14>SHALL</bcp14>", "<bcp14>SHALL | NOT</bcp14>", "<bcp14>SHOULD</bcp14>", "<bcp14>SHOULD NOT</bcp14>", "<bcp14> | |||
| NOT</bcp14>", "<bcp14>SHOULD</bcp14>", "<bcp14>SHOULD NOT</bcp14>", "<bcp14>RECO | RECOMMENDED</bcp14>", "<bcp14>NOT RECOMMENDED</bcp14>", | |||
| MMENDED</bcp14>", "<bcp14>NOT RECOMMENDED</bcp14>", | "<bcp14>MAY</bcp14>", and "<bcp14>OPTIONAL</bcp14>" in this document are to | |||
| "<bcp14>MAY</bcp14>", and "<bcp14>OPTIONAL</bcp14>" in this document are to be i | be interpreted as | |||
| nterpreted as | described in BCP 14 <xref target="RFC2119"/> <xref target="RFC8174"/> | |||
| described in BCP 14 <xref target="RFC2119"/> <xref target="RFC8174"/> when, and | when, and only when, they appear in all capitals, as shown here. | |||
| only when, they | </t> | |||
| appear in all capitals, as shown here.</t> | <t>The following terms are defined in "DNS Terminology" <xref target="RFC8 | |||
| 499"/> and are reproduced here:</t> | ||||
| <t>The following terms are defined in DNS Terminology <xref target="RFC8499"/> a | <dl newline="true"> | |||
| nd are reproduced here:</t> | <dt>Label:</dt> | |||
| <dd>An ordered list of zero or more octets that makes up a | ||||
| <t><list style="symbols"> | ||||
| <t>Label: An ordered list of zero or more octets that makes up a | ||||
| portion of a domain name. Using graph theory, a label identifies | portion of a domain name. Using graph theory, a label identifies | |||
| one node in a portion of the graph of all possible domain names.</t> | one node in a portion of the graph of all possible domain names.</dd> | |||
| <t>Domain Name: An ordered list of one or more labels.</t> | <dt>Domain Name:</dt> | |||
| <t>Fully-Qualified Domain Name (FQDN): This is often just a clear way | <dd>An ordered list of one or more labels.</dd> | |||
| <dt>Fully-Qualified Domain Name (FQDN):</dt> | ||||
| <dd>This is often just a clear way | ||||
| of saying the same thing as "domain name of a node", as outlined | of saying the same thing as "domain name of a node", as outlined | |||
| above. However, the term is ambiguous. Strictly speaking, a | above. However, the term is ambiguous. Strictly speaking, a | |||
| fully-qualified domain name would include every label, including | fully-qualified domain name would include every label, including | |||
| the zero-length label of the root: such a name would be written | the zero-length label of the root: such a name would be written | |||
| "www.example.net." (note the terminating dot). But, because every | <tt>www.example.net.</tt> (note the terminating dot). But, because every | |||
| name eventually shares the common root, names are often written | name eventually shares the common root, names are often written | |||
| relative to the root (such as "www.example.net") and are still | relative to the root (such as <tt>www.example.net</tt>) and are still | |||
| called "fully qualified". This term first appeared in <xref target="RFC0819 "/>. | called "fully qualified". This term first appeared in <xref target="RFC0819 "/>. | |||
| In this document, names are often written relative to the root.</t> | In this document, names are often written relative to the root.</dd> | |||
| </list></t> | </dl> | |||
| <t>The following definition for "subdomain" is taken from "DNS Terminology | ||||
| <t>The following definition for "subdomain" is taken from DNS Terminology <xref | " <xref target="RFC8499"/> and reproduced here; however, the definition is ambig | |||
| target="RFC8499"/> and reproduced here, however the definition is ambiguous and | uous and is further clarified below:</t> | |||
| is further clarified below:</t> | <dl newline="true"> | |||
| <dt>Subdomain:</dt> | ||||
| <t><list style="symbols"> | <dd>"A domain is a subdomain of another domain if it is | |||
| <t>Subdomain: "A domain is a subdomain of another domain if it is | ||||
| contained within that domain. This relationship can be tested by | contained within that domain. This relationship can be tested by | |||
| seeing if the subdomain's name ends with the containing domain's | seeing if the subdomain's name ends with the containing domain's | |||
| name." (Quoted from <xref section="3.1" sectionFormat="of" target="RFC1034" />.) For example, in the | name." (Quoted from <xref section="3.1" sectionFormat="of" target="RFC1034" />.) For example, in the | |||
| host name "nnn.mmm.example.com", both "mmm.example.com" and | host name <tt>nnn.mmm.example.com</tt>, both <tt>mmm.example.com</tt> and | |||
| "nnn.mmm.example.com" are subdomains of "example.com". Note that | <tt>nnn.mmm.example.com</tt> are subdomains of <tt>example.com</tt>. Note t | |||
| hat | ||||
| the comparisons here are done on whole labels; that is, | the comparisons here are done on whole labels; that is, | |||
| "ooo.example.com" is not a subdomain of "oo.example.com".</t> | <tt>ooo.example.com</tt> is not a subdomain of <tt>oo.example.com</tt>.</dd> | |||
| </list></t> | </dl> | |||
| <t>The definition is ambiguous as it appears to allow a subdomain to inclu | ||||
| <t>The definition is ambiguous as it appears to allow a subdomain to include the | de the given domain. That is, <tt>mmm.example.com</tt> ends with <tt>mmm.example | |||
| given domain. That is, "mmm.example.com" ends with "mmm.example.com" and thus i | .com</tt> and thus is a subdomain of itself. This document interprets the first | |||
| s a subdomain of itself. This document interprets the first sentence of the abov | sentence of the above definition as meaning "a domain is a subdomain of a differ | |||
| e definition as meaning "A domain is a subdomain of a different domain if it is | ent domain if it is contained within that different domain". A domain cannot be | |||
| contained within that different domain.". A domain cannot be a subdomain of itse | a subdomain of itself. For example, <tt>mmm.example.com</tt> is not a subdomain | |||
| lf. For example, "mmm.example.com" is not a subdomain of "mmm.example.com".</t> | of <tt>mmm.example.com</tt>.</t> | |||
| <t>The following additional terms are used in this document:</t> | ||||
| <t>The following additional terms are used in this document:</t> | <dl newline="true"> | |||
| <dt>Certification Authority (CA):</dt> | ||||
| <t><list style="symbols"> | <dd>An organization that is responsible for the creation, issuance, revo | |||
| <t>Certification Authority (CA): An organization that is responsible for the c | cation, and management of Certificates. The term applies equally to both root CA | |||
| reation, issuance, revocation, and management of Certificates. The term applies | s and subordinate CAs. Refer to <xref target="RFC5280"/> for detailed informatio | |||
| equally to both Root CAs and Subordinate CAs. Refer to <xref target="RFC5280"/> | n on Certification Authorities.</dd> | |||
| for detailed information on Certification Authorities.</t> | <dt>CSR:</dt> | |||
| <t>CSR: Certificate Signing Request as defined in <xref target="RFC2986"/></t> | <dd>Certificate Signing Request, as defined in <xref target="RFC2986"/>. | |||
| <t>Ancestor Domain: a domain is an ancestor domain of a subdomain if it contai | </dd> | |||
| ns that subdomain and has less labels than that subdomain. A domain cannot be an | <dt>Ancestor Domain:</dt> | |||
| ancestor domain of itself. For example, for the host name "nnn.mmm.example.com" | <dd>A domain is an ancestor domain of a subdomain if it contains that su | |||
| , both "mmm.example.com" and "example.com" are ancestor domains of "nnn.mmm.exam | bdomain and has less labels than that subdomain. A domain cannot be an ancestor | |||
| ple.com". However, "nnn.mmm.example.com" is not an ancestor domain of "nnn.mmm. | domain of itself. For example, for the host name <tt>nnn.mmm.example.com</tt>, b | |||
| example.com". Note that the comparisons here are done on whole labels; that is, | oth <tt>mmm.example.com</tt> and <tt>example.com</tt> are ancestor domains of <t | |||
| "oo.example.com" is not an ancestor domain of "ooo.example.com".</t> | t>nnn.mmm.example.com</tt>. However, <tt>nnn.mmm.example.com</tt> is not an ance | |||
| </list></t> | stor domain of <tt>nnn.mmm.example.com</tt>. Note that the comparisons here are | |||
| done on whole labels; that is, <tt>oo.example.com</tt> is not an ancestor domai | ||||
| <t>ACME <xref target="RFC8555"/> defines the following object types which are us | n of <tt>ooo.example.com</tt>.</dd> | |||
| ed in this document:</t> | </dl> | |||
| <t><xref target="RFC8555"/> defines the following object types that are us | ||||
| <t><list style="symbols"> | ed in this document:</t> | |||
| <t>Order Object: An ACME order object represents a client's request for a cert | <dl newline="false"> | |||
| ificate and is used to track the progress of that order through to issuance.</t> | <dt>Order Object:</dt> | |||
| <t>Authorization Object: An ACME authorization object represents a server's au | <dd>An ACME order object represents a client's request for a certificate | |||
| thorization for an account to represent an identifier.</t> | and is used to track the progress of that order through to issuance.</dd> | |||
| <t>Challenge Object: An ACME challenge object represents a server's offer to v | <dt>Authorization Object:</dt> | |||
| alidate a client's possession of an identifier in a specific way.</t> | <dd>An ACME authorization object represents a server's authorization for | |||
| </list></t> | an account to represent an identifier.</dd> | |||
| <dt>Challenge Object:</dt> | ||||
| <t>ACME <xref target="RFC8555"/> Section 6.3 introduces the following term which | <dd>An ACME challenge object represents a server's offer to validate a c | |||
| is used in this document:</t> | lient's possession of an identifier in a specific way.</dd> | |||
| </dl> | ||||
| <t><list style="symbols"> | <t>ACME <xref target="RFC8555" sectionFormat="comma" section="6.3"/> intro | |||
| <t>POST-as-GET Request: When a client wishes to fetch a resource from the serv | duces the following term which is used in this document:</t> | |||
| er, then it <bcp14>MUST</bcp14> send a POST request with a signed JWS body, wher | <dl newline="true"> | |||
| e the JWS body is specified in ACME <xref target="RFC8555"/> Section 6.2. ACME r | <dt>POST-as-GET Request:</dt> | |||
| efers to these as "POST-as-GET" requests.</t> | <dd>When a client wishes to fetch a resource from the server, then it <b | |||
| </list></t> | cp14>MUST</bcp14> send a POST request with a signed JSON Web Signature (JWS) bod | |||
| y, where the JWS body is specified in ACME <xref target="RFC8555" sectionFormat= | ||||
| </section> | "comma" section="6.2"/>. ACME refers to these as "POST-as-GET" requests.</dd> | |||
| <section anchor="acme-workflow-and-identifier-requirements"><name>ACME Workflow | </dl> | |||
| and Identifier Requirements</name> | </section> | |||
| <section anchor="acme-workflow-and-identifier-requirements"> | ||||
| <t>A typical ACME <xref target="RFC8555"/> workflow for issuance of certificates | <name>ACME Workflow and Identifier Requirements</name> | |||
| is as follows:</t> | <t>A typical ACME workflow for issuance of certificates is as follows:</t> | |||
| <ol spacing="normal" type="1"> | ||||
| <t><list style="numbers"> | <li>Client POSTs a newOrder request that contains a set of identifier obj | |||
| <t>client POSTs a newOrder request that contains a set of "identifiers"</t> | ects in the <tt>identifiers</tt> field of the ACME order object.</li> | |||
| <t>server replies with an order object that contains a set of links to authori | <li>Server replies with an order object that contains a set of links to | |||
| zation object(s) and a "finalize" URI</t> | authorization object(s) and a <tt>finalize</tt> URI.</li> | |||
| <t>client sends POST-as-GET requests to retrieve the authorization object(s), | <li>Client sends POST-as-GET requests to retrieve the authorization obje | |||
| with the downloaded authorization object(s) containing the "identifier" that the | ct(s), with the downloaded authorization object(s) containing the <tt>identifier | |||
| client must prove that they control, and a set of links to associated challenge | </tt> that the client must prove that they control, and a set of links to associ | |||
| s objects, one of which the client must fulfill</t> | ated challenges objects, one of which the client must fulfill.</li> | |||
| <t>client proves control over the "identifier" in the authorization object by | <li>Client proves control over the <tt>identifier</tt> in the authorizat | |||
| completing one of the specified challenges, for example, by publishing a DNS TXT | ion object by completing one of the specified challenges, for example, by publis | |||
| record</t> | hing a DNS TXT record.</li> | |||
| <t>client POSTs a CSR to the "finalize" API</t> | <li>Client POSTs a CSR to the <tt>finalize</tt> API.</li> | |||
| <t>server replies with an updated order object that includes a "certificate" U | <li>Server replies with an updated order object that includes a <tt>cert | |||
| RI</t> | ificate</tt> URI.</li> | |||
| <t>client sends POST-as-GET request to the "certificate" URI to download the c | <li>Client sends a POST-as-GET request to the <tt>certificate</tt> URI t | |||
| ertificate</t> | o download the certificate.</li> | |||
| </list></t> | </ol> | |||
| <t>ACME places the following restrictions on <tt>identifiers</tt>:</t> | ||||
| <t>ACME places the following restrictions on "identifiers":</t> | <ul spacing="normal"> | |||
| <li> | ||||
| <t><list style="symbols"> | <xref section="7.1.3" sectionFormat="comma" target="RFC8555"/>: "The a | |||
| <t><xref section="7.1.3" sectionFormat="comma" target="RFC8555"/>: The authori | uthorizations required are dictated by server policy; there may not be a 1:1 rel | |||
| zations required are dictated by server policy; there may not be a 1:1 relations | ationship between the order identifiers and the authorizations required."</li> | |||
| hip between the order identifiers and the authorizations required.</t> | <li> | |||
| <t><xref section="7.1.4" sectionFormat="comma" target="RFC8555"/>: the only ty | <xref section="7.1.4" sectionFormat="comma" target="RFC8555"/>: The on | |||
| pe of "identifier" defined by the ACME specification is an FQDN: "The only type | ly type of <tt>identifier</tt> defined by the ACME specification is an FQDN: "Th | |||
| of identifier defined by this specification is a fully qualified domain name (ty | e only type of identifier defined by this specification is a fully qualified dom | |||
| pe: "dns"). The domain name <bcp14>MUST</bcp14> be encoded in the form in which | ain name (type: "dns"). The domain name <bcp14>MUST</bcp14> be encoded in the fo | |||
| it would appear in a certificate."</t> | rm in which it would appear in a certificate."</li> | |||
| <t><xref section="7.4" sectionFormat="comma" target="RFC8555"/>: the "identifi | <li> | |||
| er" in the CSR request must match the "identifier" in the newOrder request: "The | <xref section="7.4" sectionFormat="comma" target="RFC8555"/>: The <tt> | |||
| CSR <bcp14>MUST</bcp14> indicate the exact same set of requested identifiers as | identifier</tt> in the CSR request must match the <tt>identifier</tt> in the new | |||
| the initial newOrder request."</t> | Order request: "The CSR <bcp14>MUST</bcp14> indicate the exact same set of reque | |||
| <t><xref section="8.3" sectionFormat="comma" target="RFC8555"/>: the "identifi | sted identifiers as the initial newOrder request."</li> | |||
| er", or FQDN, in the authorization object must be used when fulfilling challenge | <li> | |||
| s via HTTP: "Construct a URL by populating the URL template ... where the domain | <xref section="8.3" sectionFormat="comma" target="RFC8555"/>: The <tt> | |||
| field is set to the domain name being verified"</t> | identifier</tt>, or FQDN, in the authorization object must be used when fulfilli | |||
| <t><xref section="8.4" sectionFormat="comma" target="RFC8555"/>: the "identifi | ng challenges via HTTP: "Construct a URL by populating the URL template ... wher | |||
| er", or FQDN, in the authorization object must be used when fulfilling challenge | e the <tt>domain</tt> field is set to the domain name being verified."</li> | |||
| s via DNS: "The client constructs the validation domain name by prepending the l | <li> | |||
| abel "_acme-challenge" to the domain name being validated."</t> | <xref section="8.4" sectionFormat="comma" target="RFC8555"/>: The <tt> | |||
| </list></t> | identifier</tt>, or FQDN, in the authorization object must be used when fulfilli | |||
| ng challenges via DNS: "The client constructs the validation domain name by prep | ||||
| <t>ACME does not mandate that the "identifier" in a newOrder request matches the | ending the label "_acme-challenge" to the domain name being validated."</li> | |||
| "identifier" in authorization objects.</t> | </ul> | |||
| <t>ACME does not mandate that the <tt>identifier</tt> in a newOrder reques | ||||
| <t>The base ACME <xref target="RFC8555"/> document only specifies the "dns" iden | t matches the <tt>identifier</tt> in authorization objects.</t> | |||
| tifier type. Additional identifiers may be defined and registered in the IANA <x | <t>The ACME base document <xref target="RFC8555"/> only specifies the "dns | |||
| ref target="ACME-Identifier-Types"/> registry. For example, <xref target="RFC873 | " identifier type. Additional identifiers may be defined and registered in the I | |||
| 8"/> specifies the "ip" identifier type. This document is only relevant for the | ANA <xref target="ACME-Identifier-Types"/> registry. For example, <xref target=" | |||
| "dns" identifier type.</t> | RFC8738"/> specifies the "ip" identifier type. This document is only relevant fo | |||
| r the "dns" identifier type.</t> | ||||
| <t>Note also that ACME supports multiple different validation methods that can b | <t>Note that ACME supports multiple different validation methods that can | |||
| e used to fulfill challenges and prove ownership of identifiers. Validation meth | be used to fulfill challenges and prove ownership of identifiers. Validation met | |||
| ods are registered in the IANA <xref target="ACME-Validation-Methods"/> registry | hods are registered in the IANA <xref target="ACME-Validation-Methods"/> registr | |||
| . This document does not mandate use of any particular validation method or meth | y. This document does not mandate use of any particular validation method or met | |||
| ods. ACME server policy dictates which validation methods are supported. See <xr | hods. ACME server policy dictates which validation methods are supported. See <x | |||
| ef target="acme-server-policy-considerations"/> for more information on ACME ser | ref target="acme-server-policy-considerations"/> for more information on ACME se | |||
| ver policy.</t> | rver policy.</t> | |||
| </section> | ||||
| </section> | <section anchor="acme-issuance-of-subdomain-certificates"> | |||
| <section anchor="acme-issuance-of-subdomain-certificates"><name>ACME Issuance of | <name>ACME Issuance of Subdomain Certificates</name> | |||
| Subdomain Certificates</name> | <t>As noted in the previous section, ACME <xref target="RFC8555"/> does no | |||
| t mandate that the <tt>identifier</tt> in a newOrder request matches the <tt>ide | ||||
| <t>As noted in the previous section, ACME <xref target="RFC8555"/> does not mand | ntifier</tt> in authorization objects. This means that the ACME specification do | |||
| ate that the "identifier" in a newOrder request matches the "identifier" in auth | es not preclude an ACME server processing newOrder requests and issuing certific | |||
| orization objects. This means that the ACME specification does not preclude an A | ates for a subdomain without requiring a challenge to be fulfilled against that | |||
| CME server processing newOrder requests and issuing certificates for a subdomain | explicit subdomain.</t> | |||
| without requiring a challenge to be fulfilled against that explicit subdomain.< | <t>ACME server policy could allow issuance of certificates for a subdomain | |||
| /t> | to a client where the client only has to fulfill an authorization challenge for | |||
| an ancestor domain of that subdomain. For example, this allows for a flow where | ||||
| <t>ACME server policy could allow issuance of certificates for a subdomain to a | a client proves ownership of <tt>example.org</tt> and then successfully obtains | |||
| client where the client only has to fulfill an authorization challenge for an an | a certificate for <tt>sub.example.org</tt>.</t> | |||
| cestor domain of that subdomain. This allows a flow where a client proves owners | <t>ACME server policy is out of scope of this document; however, some comm | |||
| hip of, for example, "example.org" and then successfully obtains a certificate f | entary is provided in <xref target="acme-server-policy-considerations"/>.</t> | |||
| or "sub.example.org".</t> | <t>Clients need a mechanism to instruct the ACME server that they are requ | |||
| esting authorization for all subdomains subordinate to the specified domain, as | ||||
| <t>ACME server policy is out of scope of this document, however, some commentary | opposed to just requesting authorization for an explicit domain identifier. Clie | |||
| is provided in <xref target="acme-server-policy-considerations"/>.</t> | nts need a mechanism to do this in both newAuthz and newOrder requests. ACME ser | |||
| vers need a mechanism to indicate to clients that authorization objects are vali | ||||
| <t>Clients need a mechanism to instruct the ACME server that they are requesting | d for all subdomains under the specified domain. These are described in this sec | |||
| authorization for all subdomains subordinate to the specified domain, as oppose | tion.</t> | |||
| d to just requesting authorization for an explicit domain identifier. Clients ne | <section anchor="authorization-object"> | |||
| ed a mechanism to do this in both newAuthz and newOrder requests. ACME servers n | <name>Authorization Object</name> | |||
| eed a mechanism to indicate to clients that authorization objects are valid for | <t>ACME (<xref section="7.1.4" sectionFormat="comma" target="RFC8555"/>) | |||
| all subdomains under the specified domain. These are described in this section.< | defines the authorization object. This document defines a new <tt>subdomainAuth | |||
| /t> | Allowed</tt> field for the authorization object. | |||
| When ACME server policy allows authorization for subdomains subordinate to a dom | ||||
| <section anchor="authorization-object"><name>Authorization Object</name> | ain, the server indicates this by including the new <tt>subdomainAuthAllowed</tt | |||
| > field in the authorization object for that domain identifier:</t> | ||||
| <t>ACME (<xref section="7.1.4" sectionFormat="comma" target="RFC8555"/>) defines | <dl> | |||
| the authorization object. This document defines a new "subdomainAuthAllowed" fi | <dt><tt>subdomainAuthAllowed</tt> (optional, boolean):</dt> | |||
| eld for the authorization object. When ACME server policy allows authorization f | <dd>If present, this field | |||
| or subdomains subordinate to a domain, the server indicates this by including th | <bcp14>MUST</bcp14> be true for authorizations where ACME server policy | |||
| e new "subdomainAuthAllowed" field in the authorization object for that domain i | ||||
| dentifier:</t> | ||||
| <figure><artwork><![CDATA[ | ||||
| subdomainAuthAllowed (optional, boolean): If present, this field | ||||
| MUST be true for authorizations where ACME server policy | ||||
| allows certificates to be issued for any subdomain subordinate | allows certificates to be issued for any subdomain subordinate | |||
| to the domain specified in the 'identifier' field of the | to the domain specified in the <tt>identifier</tt> field of the | |||
| authorization object. | authorization object.</dd> | |||
| ]]></artwork></figure> | </dl> | |||
| <!--[rfced] Regarding the use of fixed-width font: | ||||
| <t>The following example shows an authorization object for the domain <spanx sty | where the spanx element was used in the provided XML file, now | |||
| le="verb">example.org</spanx> where the authorization covers the subdomains subo | the <tt> element is present. Please review whether you would like to | |||
| rdinate to <spanx style="verb">example.org</spanx>.</t> | use that element elsewhere for consistent usage. It yields | |||
| fixed-width font in the PDF and HTML files. | ||||
| <figure><artwork><![CDATA[ | Example of usage: ... for the domain <tt>example.org</tt> | |||
| { | --> | |||
| "status": "valid", | <t>The following example shows an authorization object for the domain <t | |||
| "expires": "2023-09-01T14:09:07.99Z", | t>example.org</tt>, where the authorization covers the subdomains subordinate to | |||
| <tt>example.org</tt>.</t> | ||||
| "identifier": { | ||||
| "type": "dns", | ||||
| "value": "example.org" | ||||
| }, | ||||
| "challenges": [ | ||||
| { | ||||
| "url": "https://example.com/acme/chall/prV_B7yEyA4", | ||||
| "type": "http-01", | ||||
| "status": "valid", | ||||
| "token": "DGyRejmCefe7v4NfDGDKfA", | ||||
| "validated": "2014-12-01T12:05:58.16Z" | ||||
| } | ||||
| ], | ||||
| "subdomainAuthAllowed": true | ||||
| } | ||||
| ]]></artwork></figure> | ||||
| <t>If the "subdomainAuthAllowed" field is not included, then the assumed default | ||||
| value is false.</t> | ||||
| <t>If ACME server policy allows issuance of certificates containing wildcard ide | ||||
| ntifiers under that authorization object, then the server <bcp14>SHOULD</bcp14> | ||||
| include the "wildcard" field with a value of true, as per <xref section="7.1.4" | ||||
| sectionFormat="comma" target="RFC8555"/>.</t> | ||||
| </section> | <sourcecode type="json"><![CDATA[ | |||
| <section anchor="pre-authorization"><name>Pre-Authorization</name> | { | |||
| "status": "valid", | ||||
| "expires": "2023-09-01T14:09:07.99Z", | ||||
| <t>The basic ACME workflow has authorization objects created reactively in respo | "identifier": { | |||
| nse to a certificate order. ACME also allows for pre-authorization, where client | "type": "dns", | |||
| s obtain authorization for an identifier proactively, outside of the context of | "value": "example.org" | |||
| a specific issuance. With the ACME pre-authorization flow, a client can pre-auth | }, | |||
| orize for a domain once, and then issue multiple newOrder requests for certifica | ||||
| tes with identifiers in the subdomains subordinate to that domain.</t> | ||||
| <t>ACME <xref section="7.4.1" sectionFormat="comma" target="RFC8555"/> defines t | "challenges": [ | |||
| he "identifier" object for newAuthz requests. This document defines a new "subdo | { | |||
| mainAuthAllowed" field for the "identifier" object:</t> | "url": "https://example.com/acme/chall/prV_B7yEyA4", | |||
| "type": "http-01", | ||||
| "status": "valid", | ||||
| "token": "DGyRejmCefe7v4NfDGDKfA", | ||||
| "validated": "2014-12-01T12:05:58.16Z" | ||||
| } | ||||
| ], | ||||
| <figure><artwork><![CDATA[ | "subdomainAuthAllowed": true | |||
| subdomainAuthAllowed (optional, boolean): An ACME client sets | } | |||
| ]]></sourcecode> | ||||
| <t>If the <tt>subdomainAuthAllowed</tt> field is not included, then the | ||||
| assumed default value is false.</t> | ||||
| <t>If ACME server policy allows issuance of certificates containing wild | ||||
| card identifiers under that authorization object, then the server <bcp14>SHOULD< | ||||
| /bcp14> include the <tt>wildcard</tt> field with a value of true, as per <xref s | ||||
| ection="7.1.4" sectionFormat="comma" target="RFC8555"/>.</t> | ||||
| </section> | ||||
| <section anchor="pre-authorization"> | ||||
| <name>Pre-authorization</name> | ||||
| <t>The basic ACME workflow has authorization objects created reactively | ||||
| in response to a certificate order. ACME also allows for pre-authorization, wher | ||||
| e clients obtain authorization for an identifier proactively, outside of the con | ||||
| text of a specific issuance. With the ACME pre-authorization flow, a client can | ||||
| pre-authorize for a domain once and then issue multiple newOrder requests for ce | ||||
| rtificates with identifiers in the subdomains subordinate to that domain.</t> | ||||
| <t>ACME (<xref section="7.4.1" sectionFormat="comma" target="RFC8555"/>) | ||||
| defines the <tt>identifier</tt> object for newAuthz requests. This document def | ||||
| ines a new <tt>subdomainAuthAllowed</tt> field for the <tt>identifier</tt> objec | ||||
| t:</t> | ||||
| <dl> | ||||
| <dt><tt>subdomainAuthAllowed</tt> (optional, boolean):</dt> | ||||
| <dd>An ACME client sets | ||||
| this flag to indicate to the server that it is requesting an | this 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.</dd> | |||
| ]]></artwork></figure> | </dl> | |||
| <t>Clients include the new <tt>subdomainAuthAllowed</tt> field in the <t | ||||
| <t>Clients include the new "subdomainAuthAllowed" field in the "identifier" obje | t>identifier</tt> object of newAuthz requests to indicate that they are requesti | |||
| ct of newAuthz requests to indicate that they are requesting a subdomain authori | ng a subdomain authorization. In the following example of a newAuthz payload, th | |||
| zation. In the following example newAuthz payload, the client is requesting pre- | e client is requesting pre-authorization for the subdomains subordinate to <tt>e | |||
| authorization for the subdomains subordinate to <spanx style="verb">example.org< | xample.org</tt>.</t> | |||
| /spanx>.</t> | <sourcecode type="json"><![CDATA[ | |||
| "payload": base64url({ | ||||
| <figure><artwork><![CDATA[ | "identifier": { | |||
| "payload": base64url({ | "type": "dns", | |||
| "identifier": { | "value": "example.org", | |||
| "type": "dns", | "subdomainAuthAllowed": true | |||
| "value": "example.org", | } | |||
| "subdomainAuthAllowed": true | }) | |||
| } | ]]></sourcecode> | |||
| }) | <t>If the server is willing to allow a single authorization for the subd | |||
| ]]></artwork></figure> | omains and there is not an existing authorization object for the identifier, the | |||
| n it will create an authorization object and include the <tt>subdomainAuthAllowe | ||||
| <t>If the server is willing to allow a single authorization for the subdomains, | d</tt> flag with a value of true.</t> | |||
| and there is not an existing authorization object for the identifier, then it wi | <t>If the server policy does not allow creation of subdomain authorizati | |||
| ll create an authorization object and include the "subdomainAuthAllowed" flag wi | ons subordinate to that domain, the server can create an authorization object fo | |||
| th value of true.</t> | r the indicated identifier and <bcp14>MAY</bcp14> include the <tt>subdomainAuthA | |||
| llowed</tt> flag with a value of false. If the server creates an authorization o | ||||
| <t>If the server policy does not allow creation of subdomain authorizations subo | bject and does not include the <tt>subdomainAuthAllowed</tt> flag, then the assu | |||
| rdinate to that domain, the server can create an authorization object for the in | med value is false.</t> | |||
| dicated identifier, and <bcp14>MAY</bcp14> include the "subdomainAuthAllowed" fl | <t>In both scenarios, handling of the pre-authorization follows the proc | |||
| ag with value of false. If the server creates an authorization object and does n | ess documented in ACME <xref section="7.4.1" sectionFormat="comma" target="RFC85 | |||
| ot include the "subdomainAuthAllowed" flag, then the assumed value is false.</t> | 55"/>.</t> | |||
| </section> | ||||
| <t>In both scenarios, handling of the pre-authorization follows the process docu | <section anchor="new-orders"> | |||
| mented in ACME <xref section="7.4.1" sectionFormat="comma" target="RFC8555"/>.</ | <name>New Orders</name> | |||
| t> | <t>Clients need a mechanism to optionally indicate to servers whether or | |||
| not they are authorized to fulfill challenges against an ancestor domain for a | ||||
| </section> | given identifier. For example, if a client places an order for an identifier <tt | |||
| <section anchor="new-orders"><name>New Orders</name> | >foo.bar.example.org</tt> and is authorized to fulfill a challenge against the a | |||
| ncestor domains <tt>bar.example.org</tt> or <tt>example.org</tt>, then the clien | ||||
| <t>Clients need a mechanism to optionally indicate to servers whether or not the | t needs a mechanism to indicate control over the ancestor domains to the ACME se | |||
| y are authorized to fulfill challenges against an ancestor domain for a given id | rver.</t> | |||
| entifier. For example, if a client places an order for an identifier <spanx styl | <t>In order to accomplish this, this document defines a new <tt>ancestor | |||
| e="verb">foo.bar.example.org</spanx>, and is authorized to fulfill a challenge a | Domain</tt> field for the identifier that is included in order objects.</t> | |||
| gainst the ancestor domains <spanx style="verb">bar.example.org</spanx> or <span | <dl> | |||
| x style="verb">example.org</spanx>, then the client needs a mechanism to indicat | <dt><tt>ancestorDomain</tt> (optional, string):</dt> | |||
| e control over the ancestor domains to the ACME server.</t> | <dd>This is an ancestor domain of | |||
| the requested identifier. The client <bcp14>MUST</bcp14> be able to fulfill | ||||
| <t>In order to accomplish this, this document defines a new "ancestorDomain" fie | a challenge against the ancestor domain.</dd> | |||
| ld for the identifier that is included in order objects.</t> | </dl> | |||
| <t>This field specifies an ancestor domain of the identifier that the cl | ||||
| <figure><artwork><![CDATA[ | ient has DNS control over and is capable of fulfilling challenges against. Based | |||
| ancestorDomain (optional, string): This is an ancestor domain of | on server policy, the server can choose to issue a challenge against any ancest | |||
| the requested identifier. The client MUST be able to fulfill | or domain of the identifier up to and including the specified <tt>ancestorDomain | |||
| a challenge against the ancestor domain. | </tt> and create a corresponding authorization object against the chosen identif | |||
| ]]></artwork></figure> | ier.</t> | |||
| <t>In the following example of a newOrder payload, the client requests a | ||||
| <t>This field specifies an ancestor domain of the identifier that the client has | certificate for identifier <tt>foo.bar.example.org</tt> and indicates that it c | |||
| DNS control over, and is capable of fulfilling challenges against. Based on ser | an fulfill a challenge against the ancestor domain <tt>bar.example.org</tt>. The | |||
| ver policy, the server can choose to issue a challenge against any ancestor doma | server can then choose to issue a challenge against either <tt>foo.bar.example. | |||
| in of the identifier up to and including the specified "ancestorDomain", and cre | org</tt> or <tt>bar.example.org</tt> identifiers.</t> | |||
| ate a corresponding authorization object against the chosen identifier.</t> | <sourcecode type="json"><![CDATA[ | |||
| <t>In the following example newOrder payload, the client requests a certificate | ||||
| for identifier <spanx style="verb">foo.bar.example.org</spanx> and indicates tha | ||||
| t it can fulfill a challenge against the ancestor domain <spanx style="verb">bar | ||||
| .example.org</spanx>. The server can then choose to issue a challenge against ei | ||||
| ther <spanx style="verb">foo.bar.example.org</spanx> or <spanx style="verb">bar. | ||||
| example.org</spanx> identifiers.</t> | ||||
| <figure><artwork><![CDATA[ | ||||
| "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" | |||
| }) | }) | |||
| ]]></artwork></figure> | ]]></sourcecode> | |||
| <t>In the following example of a newOrder payload, the client requests a | ||||
| <t>In the following example newOrder payload, the client requests a certificate | certificate for identifier <tt>foo.bar.example.org</tt> and indicates that it c | |||
| for identifier <spanx style="verb">foo.bar.example.org</spanx> and indicates tha | an fulfill a challenge against the ancestor domain <tt>example.org</tt>. The ser | |||
| t it can fulfill a challenge against the ancestor domain <spanx style="verb">exa | ver can then choose to issue a challenge against any one of <tt>foo.bar.example. | |||
| mple.org</spanx>. The server can then choose to issue a challenge against any on | org</tt>, <tt>bar.example.org</tt>, or <tt>example.org</tt> identifiers.</t> | |||
| e of <spanx style="verb">foo.bar.example.org</spanx>, <spanx style="verb">bar.ex | <sourcecode type="json"><![CDATA[ | |||
| ample.org</spanx> or <spanx style="verb">example.org</spanx> identifiers.</t> | ||||
| <figure><artwork><![CDATA[ | ||||
| "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" | |||
| }) | }) | |||
| ]]></artwork></figure> | ]]></sourcecode> | |||
| <t>If the client is unable to fulfill authorizations against an ancestor | ||||
| <t>If the client is unable to fulfill authorizations against an ancestor domain, | domain, the client should not include the <tt>ancestorDomain</tt> field.</t> | |||
| the client should not include the "ancestorDomain" field.</t> | <t>Server newOrder handling generally follows the process documented in | |||
| ACME (<xref section="7.4" sectionFormat="of" target="RFC8555"/>). If the server | ||||
| <t>Server newOrder handling generally follows the process documented in ACME, <x | is willing to allow subdomain authorizations for the domain specified in <tt>anc | |||
| ref section="7.4" sectionFormat="of" target="RFC8555"/>. If the server is willin | estorDomain</tt>, then it creates an authorization object against that ancestor | |||
| g to allow subdomain authorizations for the domain specified in "ancestorDomain" | domain and includes the <tt>subdomainAuthAllowed</tt> flag with a value of true. | |||
| , then it creates an authorization object against that ancestor domain and inclu | </t> | |||
| des the "subdomainAuthAllowed" flag with a value of true.</t> | <t>If the server policy does not allow creation of subdomain authorizati | |||
| ons against that ancestor domain, then it can create an authorization object for | ||||
| <t>If the server policy does not allow creation of subdomain authorizations agai | the indicated identifier value and <bcp14>SHOULD NOT</bcp14> include the <tt>su | |||
| nst that ancestor domain, then it can create an authorization object for the ind | bdomainAuthAllowed</tt> flag. As the client requested a subdomain authorization | |||
| icated identifier value, and <bcp14>SHOULD NOT</bcp14> include the "subdomainAut | for the ancestor domain and not for the indicated identifier, there is no need f | |||
| hAllowed" flag. As the client requested a subdomain authorization for the ancest | or the server to include the <tt>subdomainAuthAllowed</tt> flag in the authoriza | |||
| or domain, and not for the indicated identifier, there is no need for the server | tion object for the indicated identifier.</t> | |||
| to include the "subdomainAuthAllowed" flag in the authorization object for the | </section> | |||
| indicated identifier.</t> | <section anchor="directory-object-metadata"> | |||
| <name>Directory Object Metadata</name> | ||||
| </section> | <t>This document defines a new <tt>subdomainAuthAllowed</tt> ACME direct | |||
| <section anchor="directory-object-metadata"><name>Directory Object Metadata</nam | ory metadata field. An ACME server can advertise support for authorization of su | |||
| e> | bdomains by including the <tt>subdomainAuthAllowed</tt> boolean flag in its "ACM | |||
| E Directory Metadata Fields" registry:</t> | ||||
| <t>This document defines a new "subdomainAuthAllowed" ACME directory metadata fi | <dl> | |||
| eld. An ACME server can advertise support for authorization of subdomains by inc | <dt><tt>subdomainAuthAllowed</tt> (optional, bool):</dt> | |||
| luding the "subdomainAuthAllowed" boolean flag in its "ACME Directory Metadata F | <dd>Indicates if an ACME | |||
| ields" registry:</t> | server supports authorization of subdomains.</dd> | |||
| </dl> | ||||
| <figure><artwork><![CDATA[ | <t>If not specified, then the assumed default value is false. If an ACME | |||
| subdomainAuthAllowed (optional, bool): Indicates if an ACME | server supports authorization of subdomains, it can indicate this by including | |||
| server supports authorization of subdomains. | this field with a value of "true".</t> | |||
| ]]></artwork></figure> | </section> | |||
| </section> | ||||
| <t>If not specified, then the assumed default value is false. If an ACME server | <section anchor="illustrative-call-flow"> | |||
| supports authorization of subdomains, it can indicate this by including this fie | <name>Illustrative Call Flow</name> | |||
| ld with a value of "true".</t> | <t>The call flow illustrated here uses the ACME pre-authorization flow usi | |||
| ng DNS-based proof of ownership.</t> | ||||
| </section> | <artwork><![CDATA[ | |||
| </section> | ||||
| <section anchor="illustrative-call-flow"><name>Illustrative Call Flow</name> | ||||
| <t>The call flow illustrated here uses the ACME pre-authorization flow using DNS | ||||
| -based proof of ownership.</t> | ||||
| <figure><artwork><![CDATA[ | ||||
| +--------+ +------+ +-----+ | +--------+ +------+ +-----+ | |||
| | 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 line 345 ¶ | skipping to change at line 307 ¶ | |||
| |--------------------------->| | | |--------------------------->| | | |||
| | | 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 line 368 ¶ | skipping to change at line 330 ¶ | |||
| | 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 line 390 ¶ | skipping to change at line 352 ¶ | |||
| | | | | | | | | |||
| | 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" | | | |||
| |<---------------------------| | | |<---------------------------| | | |||
| ]]></artwork></figure> | ]]></artwork> | |||
| <t><list style="symbols"> | ||||
| <t>STEP 1: Pre-authorization of ancestor domain <vspace blankLines='1'/> | ||||
| The client sends a newAuthz request for the ancestor domain including the "subdo | ||||
| mainAuthAllowed" flag in the identifier object.</t> | ||||
| </list></t> | ||||
| <figure><artwork><![CDATA[ | ||||
| POST /acme/new-authz HTTP/1.1 | ||||
| Host: example.com | ||||
| Content-Type: application/jose+json | ||||
| { | ||||
| "protected": base64url({ | ||||
| "alg": "ES256", | ||||
| "kid": "https://example.com/acme/acct/evOfKhNU60wg", | ||||
| "nonce": "uQpSjlRb4vQVCjVYAyyUWg", | ||||
| "url": "https://example.com/acme/new-authz" | ||||
| }), | ||||
| "payload": base64url({ | ||||
| "identifier": { | ||||
| "type": "dns", | ||||
| "value": "example.org", | ||||
| "subdomainAuthAllowed": true | ||||
| } | ||||
| }), | ||||
| "signature": "nuSDISbWG8mMgE7H...QyVUL68yzf3Zawps" | ||||
| } | ||||
| ]]></artwork></figure> | ||||
| <t>The server creates and returns an authorization object for the identifier inc | ||||
| luding the "subdomainAuthAllowed" flag. The object is initially in "pending" sta | ||||
| te.</t> | ||||
| <figure><artwork><![CDATA[ | ||||
| { | ||||
| "status": "pending", | ||||
| "expires": "2023-09-01T14:09:07.99Z", | ||||
| "identifier": { | ||||
| "type": "dns", | ||||
| "value": "example.org" | ||||
| }, | ||||
| "challenges": [ | ||||
| { | ||||
| "url": "https://example.com/acme/chall/prV_B7yEyA4", | ||||
| "type": "dns-01", | ||||
| "status": "pending", | ||||
| "token": "DGyRejmCefe7v4NfDGDKfA", | ||||
| "validated": "2023-08-01T12:05:58.16Z" | ||||
| } | ||||
| ], | ||||
| "subdomainAuthAllowed": true | ||||
| } | ||||
| ]]></artwork></figure> | ||||
| <t>The example illustrates the client completing a DNS challenge by publishing a | ||||
| DNS TXT record. The client then posts to the challenge resource to inform the s | ||||
| erver that it can validate the challenge.</t> | ||||
| <t>Once the server validates the challenge by checking the DNS TXT record, the s | ||||
| erver will transition the authorization object and associated challenge object s | ||||
| tatus to "valid".</t> | ||||
| <t>The call flow above illustrates the ACME server replying to the client's chal | ||||
| lenge with status of "valid" after the ACME server has validated the DNS challen | ||||
| ge. However, the validation flow may take some time. If this is the case, the AC | ||||
| ME server may reply to the client's challenge immediately with a status of "proc | ||||
| essing", and the client will then need to poll the authorization resource to see | ||||
| when it is finalized. Refer to ACME <xref section="7.5.1" sectionFormat="comma" | ||||
| target="RFC8555"/> for more details.</t> | ||||
| <t><list style="symbols"> | ||||
| <t>STEP 2: The client places a newOrder for <spanx style="verb">sub1.example.o | ||||
| rg</spanx> <vspace blankLines='1'/> | ||||
| The client sends a newOrder request to the server and includes the subdomain ide | ||||
| ntifier. Note that the identifier is a subdomain of the ancestor domain that has | ||||
| been pre-authorized in step 1. The client does not need to include the "subdoma | ||||
| inAuthAllowed" field in the "identifier" object as it has already pre-authorized | ||||
| the ancestor domain.</t> | ||||
| </list></t> | ||||
| <figure><artwork><![CDATA[ | ||||
| POST /acme/new-order HTTP/1.1 | ||||
| Host: example.com | ||||
| Content-Type: application/jose+json | ||||
| { | ||||
| "protected": base64url({ | ||||
| "alg": "ES256", | ||||
| "kid": "https://example.com/acme/acct/evOfKhNU60wg", | ||||
| "nonce": "5XJ1L3lEkMG7tR6pA00clA", | ||||
| "url": "https://example.com/acme/new-order" | ||||
| }), | ||||
| "payload": base64url({ | ||||
| "identifiers": [ | ||||
| { "type": "dns", "value": "sub1.example.org" } | ||||
| ], | ||||
| "notBefore": "2023-09-01T00:04:00+04:00", | ||||
| "notAfter": "2023-09-08T00:04:00+04:00" | ||||
| }), | ||||
| "signature": "H6ZXtGjTZyUnPeKn...wEA4TklBdh3e454g" | ||||
| } | ||||
| ]]></artwork></figure> | ||||
| <t>As an authorization object already exists for the ancestor domain, the server | ||||
| replies with an order object with a status of "ready" that includes a link to t | ||||
| he existing "valid" authorization object.</t> | ||||
| <figure><artwork><![CDATA[ | ||||
| HTTP/1.1 201 Created | ||||
| Replay-Nonce: MYAuvOpaoIiywTezizk5vw | ||||
| Link: <https://example.com/acme/directory>;rel="index" | ||||
| Location: https://example.com/acme/order/TOlocE8rfgo | ||||
| { | ||||
| "status": "ready", | ||||
| "expires": "2023-09-01T14:09:07.99Z", | ||||
| "notBefore": "2023-09-01T00:00:00Z", | ||||
| "notAfter": "2023-09-08T00:00:00Z", | ||||
| "identifiers": [ | ||||
| { "type": "dns", "value": "sub1.example.org" } | ||||
| ], | ||||
| "authorizations": [ | ||||
| "https://example.com/acme/authz/PAniVnsZcis" | ||||
| ], | ||||
| "finalize": "https://example.com/acme/order/TOlocrfgo/finalize" | ||||
| } | ||||
| ]]></artwork></figure> | ||||
| <t>The client can proceed to finalize the order by posting a CSR to the "finaliz | ||||
| e" resource. The client can then download the certificate for <spanx style="verb | ||||
| ">sub1.example.org</spanx>.</t> | ||||
| <t><list style="symbols"> | ||||
| <t>STEP 3: The client places a newOrder for <spanx style="verb">sub2.example.o | ||||
| rg</spanx> <vspace blankLines='1'/> | ||||
| The client sends a newOrder request to the server and includes the subdomain ide | ||||
| ntifier. Note that the identifier is a subdomain of the ancestor domain that has | ||||
| been pre-authorized in step 1. The client does not need to include the "subdoma | ||||
| inAuthAllowed" field in the "identifier" object as it has already pre-authorized | ||||
| the ancestor domain.</t> | ||||
| </list></t> | ||||
| <figure><artwork><![CDATA[ | ||||
| POST /acme/new-order HTTP/1.1 | ||||
| Host: example.com | ||||
| Content-Type: application/jose+json | ||||
| { | ||||
| "protected": base64url({ | ||||
| "alg": "ES256", | ||||
| "kid": "https://example.com/acme/acct/evOfKhNU60wg", | ||||
| "nonce": "5XJ1L3lEkMG7tR6pA00clA", | ||||
| "url": "https://example.com/acme/new-order" | ||||
| }), | ||||
| "payload": base64url({ | ||||
| "identifiers": [ | ||||
| { "type": "dns", "value": "sub2.example.org" } | ||||
| ], | ||||
| "notBefore": "2023-09-01T00:04:00+04:00", | ||||
| "notAfter": "2023-09-08T00:04:00+04:00" | ||||
| }), | ||||
| "signature": "H6ZXtGjTZyUnPeKn...wEA4TklBdh3e454g" | ||||
| } | ||||
| ]]></artwork></figure> | ||||
| <t>As an authorization object already exists for the ancestor domain, the server | ||||
| replies with an order object with a status of "ready" that includes a link to t | ||||
| he existing "valid" authorization object.</t> | ||||
| <figure><artwork><![CDATA[ | ||||
| HTTP/1.1 201 Created | ||||
| Replay-Nonce: MYAuvOpaoIiywTezizk5vw | ||||
| Link: <https://example.com/acme/directory>;rel="index" | ||||
| Location: https://example.com/acme/order/TOlocE8rfgo | ||||
| { | ||||
| "status": "ready", | ||||
| "expires": "2023-09-01T14:09:07.99Z", | ||||
| "notBefore": "2023-09-01T00:00:00Z", | ||||
| "notAfter": "2023-09-08T00:00:00Z", | ||||
| "identifiers": [ | ||||
| { "type": "dns", "value": "sub2.example.org" } | ||||
| ], | ||||
| "authorizations": [ | ||||
| "https://example.com/acme/authz/PAniVnsZcis" | ||||
| ], | ||||
| "finalize": "https://example.com/acme/order/ROni7rdde/finalize" | ||||
| } | ||||
| ]]></artwork></figure> | ||||
| <t>The client can proceed to finalize the order by posting a CSR to the "finaliz | ||||
| e" resource. The client can then download the certificate for <spanx style="verb | ||||
| ">sub2.example.org</spanx>.</t> | ||||
| </section> | ||||
| <section anchor="iana-considerations"><name>IANA Considerations</name> | ||||
| <section anchor="authorization-object-fields-registry"><name>Authorization Objec | ||||
| t Fields Registry</name> | ||||
| <t>The following field is added to the "ACME Authorization Object Fields" regist | ||||
| ry defined in ACME <xref target="RFC8555"/>.</t> | ||||
| <figure><artwork><![CDATA[ | ||||
| +----------------------+------------+--------------+-----------+ | ||||
| | Field Name | Field Type | Configurable | Reference | | ||||
| +----------------------+------------+--------------+-----------+ | ||||
| | subdomainAuthAllowed | boolean | false | RFC XXXX | | ||||
| +----------------------+------------+--------------+-----------+ | ||||
| ]]></artwork></figure> | ||||
| </section> | ||||
| <section anchor="directory-object-metadata-fields-registry"><name>Directory Obje | ||||
| ct Metadata Fields Registry</name> | ||||
| <t>The following field is added to the "ACME Directory Metadata Fields" registry | ||||
| defined in ACME <xref target="RFC8555"/>.</t> | ||||
| <figure><artwork><![CDATA[ | ||||
| +----------------------+------------+-----------+ | ||||
| | Field Name | Field Type | Reference | | ||||
| +----------------------+------------+-----------+ | ||||
| | subdomainAuthAllowed | boolean | RFC XXXX | | ||||
| +----------------------+------------+-----------+ | ||||
| ]]></artwork></figure> | ||||
| </section> | <ul> | |||
| </section> | <li> | |||
| <section anchor="security-considerations"><name>Security Considerations</name> | <t>Step 1: Pre-authorization of ancestor domain.</t> | |||
| <t> | ||||
| The client sends a newAuthz request for the ancestor domain and includes the <tt | ||||
| >subdomainAuthAllowed</tt> flag in the identifier object.</t> | ||||
| <t>This document specifies enhancements to ACME <xref target="RFC8555"/> that op | <sourcecode type="http-message"><![CDATA[ | |||
| timize the protocol flows for issuance of certificates for subdomains. The under | POST /acme/new-authz HTTP/1.1 | |||
| lying goal of ACME for Subdomains remains the same as that of ACME: managing cer | Host: example.com | |||
| tificates that attest to identifier/key bindings for these subdomains. Thus, ACM | Content-Type: application/jose+json | |||
| E for Subdomains has the same two security goals as ACME:</t> | ||||
| <t><list style="numbers"> | { | |||
| <t>Only an entity that controls an identifier can get an authorization for tha | "protected": base64url({ | |||
| t identifier</t> | "alg": "ES256", | |||
| <t>Once authorized, an account key's authorizations cannot be improperly used | "kid": "https://example.com/acme/acct/evOfKhNU60wg", | |||
| by another account</t> | "nonce": "uQpSjlRb4vQVCjVYAyyUWg", | |||
| </list></t> | "url": "https://example.com/acme/new-authz" | |||
| }), | ||||
| "payload": base64url({ | ||||
| "identifier": { | ||||
| "type": "dns", | ||||
| "value": "example.org", | ||||
| "subdomainAuthAllowed": true | ||||
| } | ||||
| }), | ||||
| "signature": "nuSDISbWG8mMgE7H...QyVUL68yzf3Zawps" | ||||
| } | ||||
| ]]></sourcecode> | ||||
| <t>ACME for Subdomains makes no changes to:</t> | <t>The server creates and returns an authorization object for the identifi | |||
| er that includes the <tt>subdomainAuthAllowed</tt> flag. The object is initially | ||||
| in "pending" state.</t> | ||||
| <sourcecode type="json"><![CDATA[ | ||||
| { | ||||
| "status": "pending", | ||||
| "expires": "2023-09-01T14:09:07.99Z", | ||||
| <t><list style="symbols"> | "identifier": { | |||
| <t>account or account key management</t> | "type": "dns", | |||
| <t>ACME channel establishment, security mechanisms or threat model</t> | "value": "example.org" | |||
| <t>Validation channel establishment, security mechanisms or threat model</t> | }, | |||
| </list></t> | ||||
| <t>Therefore, all Security Considerations in ACME in the following areas are equ | "challenges": [ | |||
| ally applicable to ACME for Subdomains:</t> | { | |||
| "url": "https://example.com/acme/chall/prV_B7yEyA4", | ||||
| "type": "dns-01", | ||||
| "status": "pending", | ||||
| "token": "DGyRejmCefe7v4NfDGDKfA", | ||||
| "validated": "2023-08-01T12:05:58.16Z" | ||||
| } | ||||
| ], | ||||
| <t><list style="symbols"> | "subdomainAuthAllowed": true | |||
| <t>Threat Model</t> | } | |||
| <t>Integrity of Authorizations</t> | ]]></sourcecode> | |||
| <t>Denial-of-Service Considerations</t> | <t>The example illustrates the client completing a DNS challenge by publis | |||
| <t>Server-Side Request Forgery</t> | hing a DNS TXT record. The client then posts to the challenge resource to inform | |||
| <t>CA Policy Considerations</t> | the server that it can validate the challenge.</t> | |||
| </list></t> | <t>Once the server validates the challenge by checking the DNS TXT record, | |||
| the server will transition the authorization object and associated challenge ob | ||||
| ject status to "valid".</t> | ||||
| <t>The call flow above illustrates the ACME server replying to the client' | ||||
| s challenge with status of "valid" after the ACME server has validated the DNS c | ||||
| hallenge. However, the validation flow may take some time. If this is the case, | ||||
| the ACME server may reply to the client's challenge immediately with a status of | ||||
| "processing" and the client will then need to poll the authorization resource t | ||||
| o see when it is finalized. Refer to <xref section="7.5.1" sectionFormat="of" ta | ||||
| rget="RFC8555"/> for more details.</t> | ||||
| </li> | ||||
| <t>The only exception is that in order to satisfy goal (1) above, this draft ass | <li> | |||
| umes that control over a domain may imply control over a subdomain, and therefor | <t>Step 2: The client places a newOrder for <tt>sub1.example.org</tt>.</t> | |||
| e authorization for certificate issuance for the former may imply authorization | <t> | |||
| for certificate issuance for the latter. In many ecosystems, this is a safe ass | The client sends a newOrder request to the server and includes the subdomain | |||
| umption, especially because control over the domain can often be leveraged to su | identifier. Note that the identifier is a subdomain of the ancestor domain that | |||
| ccessfully demonstrate control over subdomains anyway, for example by temporaril | has been pre-authorized in Step 1. The client does not need to include the <tt> | |||
| y modifying DNS for the subdomain to point to a server the ancestor domain owner | subdomainAuthAllowed</tt> field in the <tt>identifier</tt> object, as it has alr | |||
| controls, rendering the distinction moot. For example, the CA/Browser Forum Ba | eady pre-authorized the ancestor domain.</t> | |||
| seline Requirements may consider control of an ancestor domain sufficient for is | ||||
| suance of certificates for subdomains, but only if specific processes and proced | ||||
| ures are used for validating ownership of the ancestor domain.</t> | ||||
| <t>In ecosystems where control of an ancestor domain may not imply control over | <sourcecode type="http-message"><![CDATA[ | |||
| subdomains or authorization for issuance of certificates for subdomains, a more | POST /acme/new-order HTTP/1.1 | |||
| complicated threat analysis and server policy might be needed.</t> | Host: example.com | |||
| Content-Type: application/jose+json | ||||
| <t>Some additional comments on ACME server policy are given later in this sectio | { | |||
| n.</t> | "protected": base64url({ | |||
| "alg": "ES256", | ||||
| "kid": "https://example.com/acme/acct/evOfKhNU60wg", | ||||
| "nonce": "5XJ1L3lEkMG7tR6pA00clA", | ||||
| "url": "https://example.com/acme/new-order" | ||||
| }), | ||||
| "payload": base64url({ | ||||
| "identifiers": [ | ||||
| { "type": "dns", "value": "sub1.example.org" } | ||||
| ], | ||||
| "notBefore": "2023-09-01T00:04:00+04:00", | ||||
| "notAfter": "2023-09-08T00:04:00+04:00" | ||||
| }), | ||||
| "signature": "H6ZXtGjTZyUnPeKn...wEA4TklBdh3e454g" | ||||
| } | ||||
| ]]></sourcecode> | ||||
| <t>As an authorization object already exists for the ancestor domain, the | ||||
| server replies with an order object with a status of "ready" that includes a lin | ||||
| k to the existing "valid" authorization object.</t> | ||||
| <sourcecode type="http-message"><![CDATA[ | ||||
| HTTP/1.1 201 Created | ||||
| Replay-Nonce: MYAuvOpaoIiywTezizk5vw | ||||
| Link: <https://example.com/acme/directory>;rel="index" | ||||
| Location: https://example.com/acme/order/TOlocE8rfgo | ||||
| <section anchor="client-account-security"><name>Client Account Security</name> | { | |||
| "status": "ready", | ||||
| "expires": "2023-09-01T14:09:07.99Z", | ||||
| <t>There may be scenarios were a client wishes to deactivate an authorization ob | "notBefore": "2023-09-01T00:00:00Z", | |||
| ject for an ancestor domain, or deactivate its account completely. For example, | "notAfter": "2023-09-08T00:00:00Z", | |||
| a client may want to do this if an account key is compromised, or if a authoriza | ||||
| tion object covering domains subordinate to an ancestor domain is no longer need | ||||
| ed. The client can deactivate an authorization using the mechanism specified in | ||||
| <xref section="7.5.2" sectionFormat="comma" target="RFC8555"/> and can deactivat | ||||
| e an account using the mechanism specified in <xref section="7.3.6" sectionForma | ||||
| t="comma" target="RFC8555"/>.</t> | ||||
| </section> | "identifiers": [ | |||
| <section anchor="subdomain-determination"><name>Subdomain Determination</name> | { "type": "dns", "value": "sub1.example.org" } | |||
| ], | ||||
| <t>The <xref target="RFC8499"/> definition of a subdomain is reproduced in <xref | "authorizations": [ | |||
| target="terminology"/>. When comparing domains to determine if one is a subdoma | "https://example.com/acme/authz/PAniVnsZcis" | |||
| in of the other, it is important to compare entire labels, and not rely on a str | ], | |||
| ing prefix match. Relying on string prefix matches may yield incorrect results.< | ||||
| /t> | ||||
| </section> | "finalize": "https://example.com/acme/order/TOlocrfgo/finalize" | |||
| <section anchor="acme-server-policy-considerations"><name>ACME Server Policy Con | } | |||
| siderations</name> | ]]></sourcecode> | |||
| <t>The client can proceed to finalize the order by posting a CSR to the <t | ||||
| t>finalize</tt> resource. The client can then download the certificate for <tt>s | ||||
| ub1.example.org</tt>.</t> | ||||
| </li> | ||||
| <t>The ACME for Subdomains and the ACME specifications do not mandate any specif | <li> | |||
| ic ACME server or CA policies, or any specific use cases for issuance of certifi | <t>Step 3: The client places a newOrder for <tt>sub2.example.org</tt>. </t> | |||
| cates. For example, an ACME server could be used:</t> | <t> | |||
| The client sends a newOrder request to the server and includes the subdomain | ||||
| identifier. Note that the identifier is a subdomain of the ancestor domain that | ||||
| has been pre-authorized in Step 1. The client does not need to include the <tt> | ||||
| subdomainAuthAllowed</tt> field in the <tt>identifier</tt> object, as it has alr | ||||
| eady pre-authorized the ancestor domain.</t> | ||||
| <t><list style="symbols"> | <sourcecode type="http-message"><![CDATA[ | |||
| <t>to issue Web PKI certificates where the ACME server must comply with CA/Bro | POST /acme/new-order HTTP/1.1 | |||
| wser Forum <xref target="CAB"></xref> Baseline Requirements.</t> | Host: example.com | |||
| <t>as a Private CA for issuance of certificates within an organization. The or | Content-Type: application/jose+json | |||
| ganization could enforce whatever policies they desire on the ACME server.</t> | ||||
| <t>for issuance of IoT device certificates. There are currently no IoT device | ||||
| certificate policies that are generally enforced across the industry. Organizati | ||||
| ons issuing IoT device certificates can enforce whatever policies they desire on | ||||
| the ACME server.</t> | ||||
| </list></t> | ||||
| <t>ACME server policy could specify whether:</t> | { | |||
| "protected": base64url({ | ||||
| "alg": "ES256", | ||||
| "kid": "https://example.com/acme/acct/evOfKhNU60wg", | ||||
| "nonce": "5XJ1L3lEkMG7tR6pA00clA", | ||||
| "url": "https://example.com/acme/new-order" | ||||
| }), | ||||
| "payload": base64url({ | ||||
| "identifiers": [ | ||||
| { "type": "dns", "value": "sub2.example.org" } | ||||
| ], | ||||
| "notBefore": "2023-09-01T00:04:00+04:00", | ||||
| "notAfter": "2023-09-08T00:04:00+04:00" | ||||
| }), | ||||
| "signature": "H6ZXtGjTZyUnPeKn...wEA4TklBdh3e454g" | ||||
| } | ||||
| ]]></sourcecode> | ||||
| <t>As an authorization object already exists for the ancestor domain, the | ||||
| server replies with an order object with a status of "ready" that includes a lin | ||||
| k to the existing "valid" authorization object.</t> | ||||
| <sourcecode type="http-message"><![CDATA[ | ||||
| HTTP/1.1 201 Created | ||||
| Replay-Nonce: MYAuvOpaoIiywTezizk5vw | ||||
| Link: <https://example.com/acme/directory>;rel="index" | ||||
| Location: https://example.com/acme/order/TOlocE8rfgo | ||||
| <t><list style="symbols"> | { | |||
| <t>issuance of subdomain certificates is allowed based on proof of ownership o | "status": "ready", | |||
| f an ancestor domain</t> | "expires": "2023-09-01T14:09:07.99Z", | |||
| <t>issuance of subdomain certificates is allowed, but only for a specific set | ||||
| of ancestor domains</t> | ||||
| <t>DNS based proof of ownership, or HTTP based proof of ownership, or both, ar | ||||
| e allowed</t> | ||||
| </list></t> | ||||
| <t>The CA policy considerations listed in <xref section="10.5" sectionFormat="co | "notBefore": "2023-09-01T00:00:00Z", | |||
| mma" target="RFC8555"/> are equally applicable here. These include, but are not | "notAfter": "2023-09-08T00:00:00Z", | |||
| limited to:</t> | ||||
| <t><list style="symbols"> | "identifiers": [ | |||
| <t>Is the claimed identifier syntactically valid?</t> | { "type": "dns", "value": "sub2.example.org" } | |||
| <t>For domain names:</t> | ], | |||
| <t>Is the name on the Public Suffix List?</t> | ||||
| <t>Is the name a high-value name?</t> | ||||
| <t>Is the key in the CSR sufficiently strong?</t> | ||||
| </list></t> | ||||
| <t>Refer to <xref section="10.5" sectionFormat="comma" target="RFC8555"/> for mo | "authorizations": [ | |||
| re CA policy considerations.</t> | "https://example.com/acme/authz/PAniVnsZcis" | |||
| ], | ||||
| <t>ACME server policy specification is explicitly out of scope of this document. | "finalize": "https://example.com/acme/order/ROni7rdde/finalize" | |||
| </t> | } | |||
| ]]></sourcecode> | ||||
| <t>The client can proceed to finalize the order by posting a CSR to the <t | ||||
| t>finalize</tt> resource. The client can then download the certificate for <tt>s | ||||
| ub2.example.org</tt>.</t> | ||||
| </section> | </li> | |||
| </section> | </ul> | |||
| </section> | ||||
| <section anchor="iana-considerations"> | ||||
| <name>IANA Considerations</name> | ||||
| <section anchor="authorization-object-fields-registry"> | ||||
| <name>Authorization Object Fields Registry</name> | ||||
| <t>The following field has been added to the "ACME Authorization Object | ||||
| Fields" registry defined in ACME <xref target="RFC8555"/>.</t> | ||||
| <table anchor="iana1"> | ||||
| <name/> | ||||
| <thead> | ||||
| <tr> | ||||
| <th>Field Name</th> | ||||
| <th>Field Type</th> | ||||
| <th>Configurable</th> | ||||
| <th>Reference</th> | ||||
| </tr> | ||||
| </thead> | ||||
| <tbody> | ||||
| <tr> | ||||
| <td>subdomainAuthAllowed</td> | ||||
| <td>boolean</td> | ||||
| <td>false</td> | ||||
| <td>RFC 9444</td> | ||||
| </tr> | ||||
| </tbody> | ||||
| </table> | ||||
| </section> | ||||
| <section anchor="directory-object-metadata-fields-registry"> | ||||
| <name>Directory Object Metadata Fields Registry</name> | ||||
| <t>The following field has been added to the "ACME Directory Metadata Fi | ||||
| elds" registry defined in <xref target="RFC8555"/>.</t> | ||||
| <table anchor="iana2"> | ||||
| <name/> | ||||
| <thead> | ||||
| <tr> | ||||
| <th>Field Name</th> | ||||
| <th>Field Type</th> | ||||
| <th>Reference</th> | ||||
| </tr> | ||||
| </thead> | ||||
| <tbody> | ||||
| <tr> | ||||
| <td>subdomainAuthAllowed</td> | ||||
| <td>boolean</td> | ||||
| <td>RFC 9444</td> | ||||
| </tr> | ||||
| </tbody> | ||||
| </table> | ||||
| </section> | ||||
| </section> | ||||
| <section anchor="security-considerations"> | ||||
| <name>Security Considerations</name> | ||||
| <t>This document specifies enhancements to ACME <xref target="RFC8555"/> t | ||||
| hat optimize the protocol flows for issuance of certificates for subdomains. The | ||||
| underlying goal of ACME for Subdomains remains the same as that of ACME: managi | ||||
| ng certificates that attest to identifier/key bindings for these subdomains. Thu | ||||
| s, ACME for Subdomains has the same two security goals as ACME:</t> | ||||
| <ol spacing="normal" type="(%d)"><li>Only an entity that controls an ident | ||||
| ifier can get an authorization for that identifier.</li> | ||||
| <li>Once authorized, an account key's authorizations cannot be improperl | ||||
| y used by another account.</li> | ||||
| </ol> | ||||
| <t>ACME for Subdomains makes no changes to:</t> | ||||
| <ul spacing="normal"> | ||||
| <li>account or account key management</li> | ||||
| <li>ACME channel establishment, security mechanisms, or threat model</li | ||||
| > | ||||
| <li>validation channel establishment, security mechanisms, or threat mod | ||||
| el</li> | ||||
| </ul> | ||||
| <t>Therefore, all Security Considerations in ACME in the following areas a | ||||
| re equally applicable to ACME for Subdomains:</t> | ||||
| <ul spacing="normal"> | ||||
| <li>Threat Model</li> | ||||
| <li>Integrity of Authorizations</li> | ||||
| <li>Denial-of-Service Considerations</li> | ||||
| <li>Server-Side Request Forgery</li> | ||||
| <li>CA Policy Considerations</li> | ||||
| </ul> | ||||
| <t>The only exception is that in order to satisfy goal (1) above, this doc | ||||
| ument assumes that control over a domain may imply control over a subdomain; the | ||||
| refore, authorization for certificate issuance for the former may imply authoriz | ||||
| ation for certificate issuance for the latter. | ||||
| In many ecosystems, this is a safe assumption, especially because control over t | ||||
| he domain can often be leveraged to successfully demonstrate control over subdom | ||||
| ains anyway, for example, by temporarily modifying DNS for the subdomain to poin | ||||
| t to a server the ancestor domain owner controls, rendering the distinction moot | ||||
| . For example, the CA/Browser Forum Baseline Requirements may consider control | ||||
| of an ancestor domain sufficient for issuance of certificates for subdomains, bu | ||||
| t only if specific processes and procedures are used for validating ownership of | ||||
| the ancestor domain.</t> | ||||
| <t>In ecosystems where control of an ancestor domain may not imply control | ||||
| over subdomains or authorization for issuance of certificates for subdomains, a | ||||
| more complicated threat analysis and server policy might be needed.</t> | ||||
| <t>Some additional comments on ACME server policy are given later in this | ||||
| section.</t> | ||||
| <section anchor="client-account-security"> | ||||
| <name>Client Account Security</name> | ||||
| <t>There may be scenarios were a client wishes to deactivate an authoriz | ||||
| ation object for an ancestor domain or deactivate its account completely. For ex | ||||
| ample, a client may want to do this if an account key is compromised or if an au | ||||
| thorization object covering domains subordinate to an ancestor domain is no long | ||||
| er needed. The client can deactivate an authorization using the mechanism specif | ||||
| ied in <xref section="7.5.2" sectionFormat="comma" target="RFC8555"/> and can de | ||||
| activate an account using the mechanism specified in <xref section="7.3.6" secti | ||||
| onFormat="comma" target="RFC8555"/>.</t> | ||||
| </section> | ||||
| <section anchor="subdomain-determination"> | ||||
| <name>Subdomain Determination</name> | ||||
| <t>The <xref target="RFC8499"/> definition of a subdomain is reproduced | ||||
| in <xref target="terminology"/>. When comparing domains to determine if one is a | ||||
| subdomain of the other, it is important to compare entire labels and not rely o | ||||
| n a string prefix match. Relying on string prefix matches may yield incorrect re | ||||
| sults.</t> | ||||
| </section> | ||||
| <section anchor="acme-server-policy-considerations"> | ||||
| <name>ACME Server Policy Considerations</name> | ||||
| <t>The ACME for Subdomains and the ACME specifications do not mandate an | ||||
| y specific ACME server or CA policies, or any specific use cases for issuance of | ||||
| certificates. For example, an ACME server could be used:</t> | ||||
| <ul spacing="normal"> | ||||
| <li>to issue Web PKI certificates where the ACME server must comply wi | ||||
| th CA/Browser Forum Baseline Requirements <xref target="CAB"/>.</li> | ||||
| <li>as a Private CA for issuance of certificates within an organizatio | ||||
| n. The organization could enforce whatever policies they desire on the ACME serv | ||||
| er.</li> | ||||
| <li>for issuance of Internet of Things (IoT) device certificates. Ther | ||||
| e are currently no IoT device certificate policies that are generally enforced a | ||||
| cross the industry. Organizations issuing IoT device certificates can enforce wh | ||||
| atever policies they desire on the ACME server.</li> | ||||
| </ul> | ||||
| <t>ACME server policy could specify whether:</t> | ||||
| <ul spacing="normal"> | ||||
| <li>issuance of subdomain certificates is allowed based on proof of ow | ||||
| nership of an ancestor domain.</li> | ||||
| <li>issuance of subdomain certificates is allowed, but only for a spec | ||||
| ific set of ancestor domains.</li> | ||||
| <li>DNS-based or HTTP-based proof of ownership, or both, are allowed.< | ||||
| /li> | ||||
| </ul> | ||||
| <t>The CA policy considerations listed in <xref section="10.5" sectionFo | ||||
| rmat="comma" target="RFC8555"/> are equally applicable here. These include, but | ||||
| are not limited to:</t> | ||||
| <ul spacing="normal"> | ||||
| <li>Is the claimed identifier syntactically valid?</li> | ||||
| <li><t>For domain names:</t> | ||||
| <ul> | ||||
| <li>Is the name on the Public Suffix List?</li> | ||||
| <li>Is the name a high-value name?</li> | ||||
| </ul> | ||||
| </li> | ||||
| <li>Is the key in the CSR sufficiently strong?</li> | ||||
| </ul> | ||||
| <t>Refer to <xref section="10.5" sectionFormat="comma" target="RFC8555"/ | ||||
| > for more CA policy considerations.</t> | ||||
| <t>ACME server policy specification is explicitly out of scope of this d | ||||
| ocument.</t> | ||||
| </section> | ||||
| </section> | ||||
| </middle> | </middle> | |||
| <back> | <back> | |||
| <references> | ||||
| <name>References</name> | ||||
| <references> | ||||
| <name>Normative References</name> | ||||
| <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8 | ||||
| 555.xml"/> | ||||
| <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.2 | ||||
| 119.xml"/> | ||||
| <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8 | ||||
| 174.xml"/> | ||||
| <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8 | ||||
| 499.xml"/> | ||||
| </references> | ||||
| <references> | ||||
| <name>Informative References</name> | ||||
| <reference anchor="CAB" target="https://cabforum.org/baseline-requiremen | ||||
| ts-documents/"> | ||||
| <front> | ||||
| <title>Baseline Requirements for the Issuance and | ||||
| Management of Publicly-Trusted Certificates</title> | ||||
| <author> | ||||
| <organization>CA/Browser Forum</organization> | ||||
| </author> | ||||
| </front> | ||||
| </reference> | ||||
| <references title='Normative References'> | <reference anchor="ACME-Identifier-Types" target="https://www.iana.org/a | |||
| ssignments/acme/"> | ||||
| <reference anchor='RFC8555' target='https://www.rfc-editor.org/info/rfc8555'> | <front> | |||
| <front> | <title>ACME Identifier Types</title> | |||
| <title>Automatic Certificate Management Environment (ACME)</title> | <author> | |||
| <author fullname='R. Barnes' initials='R.' surname='Barnes'><organization/></aut | <organization>IANA</organization> | |||
| hor> | </author> | |||
| <author fullname='J. Hoffman-Andrews' initials='J.' surname='Hoffman-Andrews'><o | </front> | |||
| rganization/></author> | </reference> | |||
| <author fullname='D. McCarney' initials='D.' surname='McCarney'><organization/>< | <reference anchor="ACME-Validation-Methods" target="https://www.iana.org | |||
| /author> | /assignments/acme/"> | |||
| <author fullname='J. Kasten' initials='J.' surname='Kasten'><organization/></aut | <front> | |||
| hor> | <title>ACME Validation Methods</title> | |||
| <date month='March' year='2019'/> | <author> | |||
| <abstract><t>Public Key Infrastructure using X.509 (PKIX) certificates are used | <organization>IANA</organization> | |||
| for a number of purposes, the most significant of which is the authentication of | </author> | |||
| domain names. Thus, certification authorities (CAs) in the Web PKI are trusted | </front> | |||
| to verify that an applicant for a certificate legitimately represents the domai | </reference> | |||
| n name(s) in the certificate. As of this writing, this verification is done thr | <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.5 | |||
| ough a collection of ad hoc mechanisms. This document describes a protocol that | 280.xml"/> | |||
| a CA and an applicant can use to automate the process of verification and certi | <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.0 | |||
| ficate issuance. The protocol also provides facilities for other certificate ma | 819.xml"/> | |||
| nagement functions, such as certificate revocation.</t></abstract> | <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.1 | |||
| </front> | 034.xml"/> | |||
| <seriesInfo name='RFC' value='8555'/> | <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.2 | |||
| <seriesInfo name='DOI' value='10.17487/RFC8555'/> | 986.xml"/> | |||
| </reference> | <xi:include href="https://bib.ietf.org/public/rfc/bibxml/reference.RFC.8 | |||
| 738.xml"/> | ||||
| <reference anchor='RFC2119' target='https://www.rfc-editor.org/info/rfc2119'> | </references> | |||
| <front> | ||||
| <title>Key words for use in RFCs to Indicate Requirement Levels</title> | ||||
| <author fullname='S. Bradner' initials='S.' surname='Bradner'><organization/></a | ||||
| uthor> | ||||
| <date month='March' year='1997'/> | ||||
| <abstract><t>In many standards track documents several words are used to signify | ||||
| the requirements in the specification. These words are often capitalized. This | ||||
| document defines these words as they should be interpreted in IETF documents. | ||||
| This document specifies an Internet Best Current Practices for the Internet Comm | ||||
| unity, and requests discussion and suggestions for improvements.</t></abstract> | ||||
| </front> | ||||
| <seriesInfo name='BCP' value='14'/> | ||||
| <seriesInfo name='RFC' value='2119'/> | ||||
| <seriesInfo name='DOI' value='10.17487/RFC2119'/> | ||||
| </reference> | ||||
| <reference anchor='RFC8174' target='https://www.rfc-editor.org/info/rfc8174'> | ||||
| <front> | ||||
| <title>Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words</title> | ||||
| <author fullname='B. Leiba' initials='B.' surname='Leiba'><organization/></autho | ||||
| r> | ||||
| <date month='May' year='2017'/> | ||||
| <abstract><t>RFC 2119 specifies common key words that may be used in protocol s | ||||
| pecifications. This document aims to reduce the ambiguity by clarifying that on | ||||
| ly UPPERCASE usage of the key words have the defined special meanings.</t></abs | ||||
| tract> | ||||
| </front> | ||||
| <seriesInfo name='BCP' value='14'/> | ||||
| <seriesInfo name='RFC' value='8174'/> | ||||
| <seriesInfo name='DOI' value='10.17487/RFC8174'/> | ||||
| </reference> | ||||
| <reference anchor='RFC8499' target='https://www.rfc-editor.org/info/rfc8499'> | ||||
| <front> | ||||
| <title>DNS Terminology</title> | ||||
| <author fullname='P. Hoffman' initials='P.' surname='Hoffman'><organization/></a | ||||
| uthor> | ||||
| <author fullname='A. Sullivan' initials='A.' surname='Sullivan'><organization/>< | ||||
| /author> | ||||
| <author fullname='K. Fujiwara' initials='K.' surname='Fujiwara'><organization/>< | ||||
| /author> | ||||
| <date month='January' year='2019'/> | ||||
| <abstract><t>The Domain Name System (DNS) is defined in literally dozens of diff | ||||
| erent RFCs. The terminology used by implementers and developers of DNS protocol | ||||
| s, and by operators of DNS systems, has sometimes changed in the decades since t | ||||
| he DNS was first defined. This document gives current definitions for many of t | ||||
| he terms used in the DNS in a single document.</t><t>This document obsoletes RFC | ||||
| 7719 and updates RFC 2308.</t></abstract> | ||||
| </front> | ||||
| <seriesInfo name='BCP' value='219'/> | ||||
| <seriesInfo name='RFC' value='8499'/> | ||||
| <seriesInfo name='DOI' value='10.17487/RFC8499'/> | ||||
| </reference> | ||||
| </references> | ||||
| <references title='Informative References'> | ||||
| <reference anchor="CAB" target="https://cabforum.org/baseline-requirements-docum | ||||
| ents/"> | ||||
| <front> | ||||
| <title>Baseline Requirements for the Issuance and Management of Publicly-Tru | ||||
| sted Certificates</title> | ||||
| <author > | ||||
| <organization>CA/Browser Forum</organization> | ||||
| </author> | ||||
| <date year="n.d."/> | ||||
| </front> | ||||
| </reference> | ||||
| <reference anchor="ACME-Identifier-Types" target="https://www.iana.org/assignmen | ||||
| ts/acme/acme.xhtml#acme-identifier-types"> | ||||
| <front> | ||||
| <title>ACME Identifier Types</title> | ||||
| <author > | ||||
| <organization>IANA</organization> | ||||
| </author> | ||||
| <date year="n.d."/> | ||||
| </front> | ||||
| </reference> | ||||
| <reference anchor="ACME-Validation-Methods" target="https://www.iana.org/assignm | ||||
| ents/acme/acme.xhtml#acme-validation-methods"> | ||||
| <front> | ||||
| <title>ACME Validation Methods</title> | ||||
| <author > | ||||
| <organization>IANA</organization> | ||||
| </author> | ||||
| <date year="n.d."/> | ||||
| </front> | ||||
| </reference> | ||||
| <reference anchor='RFC5280' target='https://www.rfc-editor.org/info/rfc5280'> | ||||
| <front> | ||||
| <title>Internet X.509 Public Key Infrastructure Certificate and Certificate Revo | ||||
| cation List (CRL) Profile</title> | ||||
| <author fullname='D. Cooper' initials='D.' surname='Cooper'><organization/></aut | ||||
| hor> | ||||
| <author fullname='S. Santesson' initials='S.' surname='Santesson'><organization/ | ||||
| ></author> | ||||
| <author fullname='S. Farrell' initials='S.' surname='Farrell'><organization/></a | ||||
| uthor> | ||||
| <author fullname='S. Boeyen' initials='S.' surname='Boeyen'><organization/></aut | ||||
| hor> | ||||
| <author fullname='R. Housley' initials='R.' surname='Housley'><organization/></a | ||||
| uthor> | ||||
| <author fullname='W. Polk' initials='W.' surname='Polk'><organization/></author> | ||||
| <date month='May' year='2008'/> | ||||
| <abstract><t>This memo profiles the X.509 v3 certificate and X.509 v2 certificat | ||||
| e revocation list (CRL) for use in the Internet. An overview of this approach a | ||||
| nd model is provided as an introduction. The X.509 v3 certificate format is des | ||||
| cribed in detail, with additional information regarding the format and semantics | ||||
| of Internet name forms. Standard certificate extensions are described and two | ||||
| Internet-specific extensions are defined. A set of required certificate extensi | ||||
| ons is specified. The X.509 v2 CRL format is described in detail along with sta | ||||
| ndard and Internet-specific extensions. An algorithm for X.509 certification pa | ||||
| th validation is described. An ASN.1 module and examples are provided in the ap | ||||
| pendices. [STANDARDS-TRACK]</t></abstract> | ||||
| </front> | ||||
| <seriesInfo name='RFC' value='5280'/> | ||||
| <seriesInfo name='DOI' value='10.17487/RFC5280'/> | ||||
| </reference> | ||||
| <reference anchor='RFC0819' target='https://www.rfc-editor.org/info/rfc819'> | ||||
| <front> | ||||
| <title>The Domain Naming Convention for Internet User Applications</title> | ||||
| <author fullname='Z. Su' initials='Z.' surname='Su'><organization/></author> | ||||
| <author fullname='J. Postel' initials='J.' surname='Postel'><organization/></aut | ||||
| hor> | ||||
| <date month='August' year='1982'/> | ||||
| <abstract><t>This RFC is an attempt to clarify the generalization of the Domain | ||||
| Naming Convention, the Internet Naming Convention, and to explore the implicatio | ||||
| ns of its adoption for Internet name service and user applications.</t></abstrac | ||||
| t> | ||||
| </front> | ||||
| <seriesInfo name='RFC' value='819'/> | ||||
| <seriesInfo name='DOI' value='10.17487/RFC0819'/> | ||||
| </reference> | ||||
| <reference anchor='RFC1034' target='https://www.rfc-editor.org/info/rfc1034'> | ||||
| <front> | ||||
| <title>Domain names - concepts and facilities</title> | ||||
| <author fullname='P. Mockapetris' initials='P.' surname='Mockapetris'><organizat | ||||
| ion/></author> | ||||
| <date month='November' year='1987'/> | ||||
| <abstract><t>This RFC is the revised basic definition of The Domain Name System. | ||||
| It obsoletes RFC-882. This memo describes the domain style names and their us | ||||
| ed for host address look up and electronic mail forwarding. It discusses the cl | ||||
| ients and servers in the domain name system and the protocol used between them.< | ||||
| /t></abstract> | ||||
| </front> | ||||
| <seriesInfo name='STD' value='13'/> | ||||
| <seriesInfo name='RFC' value='1034'/> | ||||
| <seriesInfo name='DOI' value='10.17487/RFC1034'/> | ||||
| </reference> | ||||
| <reference anchor='RFC2986' target='https://www.rfc-editor.org/info/rfc2986'> | ||||
| <front> | ||||
| <title>PKCS #10: Certification Request Syntax Specification Version 1.7</title> | ||||
| <author fullname='M. Nystrom' initials='M.' surname='Nystrom'><organization/></a | ||||
| uthor> | ||||
| <author fullname='B. Kaliski' initials='B.' surname='Kaliski'><organization/></a | ||||
| uthor> | ||||
| <date month='November' year='2000'/> | ||||
| <abstract><t>This memo represents a republication of PKCS #10 v1.7 from RSA Labo | ||||
| ratories' Public-Key Cryptography Standards (PKCS) series, and change control is | ||||
| retained within the PKCS process. The body of this document, except for the se | ||||
| curity considerations section, is taken directly from the PKCS #9 v2.0 or the PK | ||||
| CS #10 v1.7 document. This memo provides information for the Internet community | ||||
| .</t></abstract> | ||||
| </front> | ||||
| <seriesInfo name='RFC' value='2986'/> | ||||
| <seriesInfo name='DOI' value='10.17487/RFC2986'/> | ||||
| </reference> | ||||
| <reference anchor='RFC8738' target='https://www.rfc-editor.org/info/rfc8738'> | ||||
| <front> | ||||
| <title>Automated Certificate Management Environment (ACME) IP Identifier Validat | ||||
| ion Extension</title> | ||||
| <author fullname='R.B. Shoemaker' initials='R.B.' surname='Shoemaker'><organizat | ||||
| ion/></author> | ||||
| <date month='February' year='2020'/> | ||||
| <abstract><t>This document specifies identifiers and challenges required to enab | ||||
| le the Automated Certificate Management Environment (ACME) to issue certificates | ||||
| for IP addresses.</t></abstract> | ||||
| </front> | ||||
| <seriesInfo name='RFC' value='8738'/> | ||||
| <seriesInfo name='DOI' value='10.17487/RFC8738'/> | ||||
| </reference> | ||||
| </references> | </references> | |||
| </back> | </back> | |||
| <!-- ##markdown-source: | ||||
| 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 | ||||
| ksHvtGnRtNFiRUYhnaQK+SbxeVENY6pCRbVVvaYgGUnqTmOMwhOusumgR2Qs | ||||
| kko1rRM0528CViZkwhgwuVHkJfuJb5tAq7kCKHqvmJPFieaFuIYdOok3/v4j | ||||
| Z83mgqjPmuHptnhxSIuSa47rsV3aNot2gVUks7BIcqAgcGtjIj+t+HzsyKpX | ||||
| J7HQqSIj02vpCF3ag82I5yC8SI2p7REJI8LJQqiksnHIQdMjwWMEFJFjBZbV | ||||
| rJ0R3+7jMayLOUnTjSrU82SnTiiJt1NtXkHbtng5zfNgEhZuQOjlwGQH+YHt | ||||
| OujWygB72ewYsfGyPpIlBucYkeqMZLT25FtjagXmmLxMTzqLKaeUIhg/UXNS | ||||
| rYN6VKup/E3/hzpBvK723Z0BnUJpTHSkN3dzXWnxX+/QtQRwkzub3RzZoxTe | ||||
| gCKbBNK7ycjbrhqRxi0PMZmzWj2yCK63gNYVNt6+s7XSFexs48RZWzS7MZ/B | ||||
| XUVLa1G4JFBRFnl36TSkAZ1MxoNRddncFqbzPGeTne1U/xHPzTXmsVoS4ViN | ||||
| Yg+w2GhDk054Vkacw4QLdiHiTn3nrgNArmQjyW2bCcNWt8+EqaL1rTDwVUJA | ||||
| z7eKT7GJedWhWQ8dteUAE6qzViQFrrNgMiGp6ocYpUvrobtVxix4beOrFrgQ | ||||
| 4sdO+8u1wDyQNZo2aAW+aba3xhhFE8x3oEceSVg62Qjo7OyMdvZHOzu36H/7 | ||||
| tQ/G05KMyKr9g2b7htn3W6azn4bGUCjopK0O9Xi1YvtNkN2vheSmDa9rlTWU | ||||
| VtOk7raRalSp5rQv2DJOvUodVumcicVSurU5ZzKTBZl61zMyB87BJjAukZLs | ||||
| bnDTxvZ5Vp2+RCPEXAt3t3WQ8ZeuNOPdPdcmUzmOlLqeTxH+fL7UNkid+X6a | ||||
| K8XgswqvjjNf178JxFh5RCM5EB3zqjahmjOirb/8Ks/P8azZVbEuuA4P5dd2 | ||||
| Cq/eT/IDwb7TYVJAw7zY6M09LFcSxmEZNouJXCvExrlQtsuF7kuzq42XOSI+ | ||||
| jC9R+yibM9Lej6qRl2fHrQMWHaazSEpA1/Vp+GrOZrLiCQKo+jad5gNCgWD+ | ||||
| H1ldmExtRgZKTD1Rm2i0ZV6BlaxIPVZMXH/fAIVUIxvkOuMODPs54br2vqb1 | ||||
| J5rioo/yok8JOUdpusJCNHSa9wB3o58Awjikj0eLOXUiMa30CdxWdQ5fvBsa | ||||
| IRzgiQwn5EpQaRQ6AG9yLrTK7t0a6n+3RPvfLfcV/7jVe6f3+MU7zxfvGKx3 | ||||
| +gf6Qu8+Ygz+ess/9+W7nji/eHwqdkftHRLO4arJnA/unJ7QgZHbNpp6VfOG | ||||
| 5XFF82H3vz/7ev9A2Pd2dptqZkvzP26B5icA5pRz/23a/xXNfzJE1pH6KURQ | ||||
| 2dMfDcyHr+o3mEi8uW5zz1T3dnYEbxr/iXNgtsL+MxPBoUwliE4PDfyqiYDE | ||||
| zB6IGYw6OhFHUA+7rl/yiSKGbfMrkdIctb+t+U9KjO3mKGI0dYFZGm+2N/+5 | ||||
| RQwh0pwUurI5nno4Hz/3IfSXQOSOOPnKy6m/FCLdeMe25v8ezFwb9sfHH7Cq | ||||
| Px8iSWbc8cqMvV9EZuz9LjM8zT9BZuz9LjNEE5G/fZlx9apeH5HkaQ1rXkrL | ||||
| xWx6KTiGs9nFh1HDVupIV2Tlek6/GxFxwkMmUdSkc/CaUsYijE+wv6WzdLd3 | ||||
| g11s8DTHM4ROeiM+PMDMrayko00jU4ISp3v7Va7krVdYDthN8sRKkzCs7Iof | ||||
| h+kMg66Pz/fu3nMCsq+TeGuOZRhF5W15eTL9av78xb2d9awWzAWs4derr5fn | ||||
| r9Kzyf7l198cvPrm+/Fm8+Jbt+VVmZwWLzb0a3JUf82JMAZGLH0AwoOj4Nnq | ||||
| /PDofPLtlw8Wx7PH958GQfD15psXz+492Lyd3vkhXC9V38nu1HTaSqjAFEPo | ||||
| Mrs6nbhWbeKaVMubH7oj2pWmU6eczdjXxxX7JBPltnxi0/I/K6M4xmrsXQnF | ||||
| DZTwhx+fUoxIfPBTpxRrojNbd1WUrBaZdmoUcJ2BynXfXoWglmdAEcVlrtP0 | ||||
| ePvadGOrjlAEmg57e7IWMV5o667UOqAyZ/jfE8xRdj41zVVjQKy8MJfRa8Mi | ||||
| dbhrKQKURAZIyVSia2B1hL2p5oSnwoR5z6SBU9TJ5hbqeqySK5g118KNsGKR | ||||
| ho3eCKrW6XPljEkRUz0iBkx5RBHinlurP8y3sORm8VFht15A0zl9SfDieV0s | ||||
| hsjHu8pkYdLDODuFAASRPWgNix/SVLbMI1ksZIwIxeq2usBMNavq4GG/VX+Z | ||||
| 1w2JzhTgXub8pLF8LvEpKfkAOCfJGkM2duqLdSeH3aXUYnuglOuOcTUxE/Jw | ||||
| +MHkXFXbiPjly6af9XKLCdMoKVNL9W1tx/nqMzfLYbkqpFUhz2ce0ZdIPhMs | ||||
| bVHLCKe9RlXKpdityQG7nWeW5TpbTldlA3MJQ0rXT9kLasDiTVvqMMzYu/x/ | ||||
| ZZjd/e6vu8/upI9fH395vzy7txzv7ETp+AMNM8LLRxtmV2QrOKq9HWr4BVIO | ||||
| vDbd03s/fFd++erih82L7FR+lYFNt3483r94nT6K53fk/t39mWvTjbdspWsy | ||||
| peRm1b2x63D01hJQbdlI/eu6SU6tHiyGZESFzay26sF70M2wieEICjkc8AEY | ||||
| fH4GgIWb4XMktpE4/n68ujxZhvlRsllfyLfJ29d3L9fY7hkMPRJ/7KQxu4X7 | ||||
| 5z8UMv1TP8li+Ybw+UxXkazusGh9TNi4fXGS5tHjB8V0ltd4rzLLGC0fY6du | ||||
| Izj8zw+21y2UZhq2bN+6qfoRzFHZfvVNKrffLVIEna7bp+Ms+SZTP0SJ6jd7 | ||||
| tSWjtokJZxVwDWwkyOUKRxfwMSLQ4Tpx2MSNkDiZvKmmjDm34a9gZfR3TcvY | ||||
| RK6uQlId2rbS1neuqa33ftfWv2vr/2xtvfe7tv5dW/+urT+EOX5F2vrsJEvu | ||||
| F3Esfwvaeq+prT/jalUHtTIxnVVEdModMAFn3DULONhT9GEc64LHCD75/Fv6 | ||||
| q1L43JrgrQJPQc9K1Fv+DY9bnT/qP2/Zjt4xCHzLSvXPPEZ1hxtteTZNZquC | ||||
| 8qXfcTCDqua/+zkg8iYwvrO5kdSG0gerTwBH4jv4J35KiLammn4KKVwjl/O6 | ||||
| hPDBs6wQfc219y32p416nfX1LehHjAr8bW5TbfF41+V9MpujZuaLKKuInVNo | ||||
| jeuVL8tkYeSXvZ9tassybC0Q5qTQkiCjOhcclJ3lId3sQ8PWb5IF6tCnD+f6 | ||||
| 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 | ||||
| Q6oL737ybl0049xTv7UCedD7P1ZGop0yiAAA | ||||
| </rfc> | </rfc> | |||
| End of changes. 58 change blocks. | ||||
| 1170 lines changed or deleted | 769 lines changed or added | |||
This html diff was produced by rfcdiff 1.48. | ||||