rfc9773v1.txt   rfc9773.txt 
skipping to change at line 52 skipping to change at line 52
include Revised BSD License text as described in Section 4.e of the include Revised BSD License text as described in Section 4.e of the
Trust Legal Provisions and are provided without warranty as described Trust Legal Provisions and are provided without warranty as described
in the Revised BSD License. in the Revised BSD License.
Table of Contents Table of Contents
1. Introduction 1. Introduction
2. Conventions and Definitions 2. Conventions and Definitions
3. Extensions to the Directory Object 3. Extensions to the Directory Object
4. Getting Renewal Information 4. Getting Renewal Information
4.1. The "renewalInfo" Resource 4.1. The RenewalInfo Resource
4.2. RenewalInfo Objects 4.2. RenewalInfo Objects
4.3. Schedule for Checking the RenewalInfo Resource 4.3. Schedule for Checking the RenewalInfo Resource
4.3.1. Server Choice of Retry-After 4.3.1. Server Choice of Retry-After
4.3.2. Client Handling of Retry-After 4.3.2. Client Handling of Retry-After
4.3.3. Error Handling 4.3.3. Error Handling
5. Extensions to the Order Object 5. Extensions to the Order Object
6. Security Considerations 6. Security Considerations
7. IANA Considerations 7. IANA Considerations
7.1. ACME Resource Type 7.1. ACME Resource Type
7.2. ACME Renewal Info Object Fields 7.2. ACME RenewalInfo Object Fields
7.3. ACME Order Object Fields 7.3. ACME Order Object Fields
7.4. ACME Error Types 7.4. ACME Error Types
8. References 8. References
8.1. Normative References 8.1. Normative References
8.2. Informative References 8.2. Informative References
Appendix A. Example Certificate Appendix A. Example Certificate
Acknowledgments Acknowledgments
Author's Address Author's Address
1. Introduction 1. Introduction
skipping to change at line 128 skipping to change at line 128
"Modification" as defined in [RFC3647]. "Modification" as defined in [RFC3647].
This document assumes that the certificates being issued by the ACME This document assumes that the certificates being issued by the ACME
server are in compliance with [RFC5280] and, in particular, contain server are in compliance with [RFC5280] and, in particular, contain
the Authority Key Identifier extension and the keyIdentifier field the Authority Key Identifier extension and the keyIdentifier field
within that extension. within that extension.
3. Extensions to the Directory Object 3. Extensions to the Directory Object
An ACME server that wishes to provide renewal information MUST An ACME server that wishes to provide renewal information MUST
include a new field, renewalInfo, in its directory object. include a new field, "renewalInfo", in its directory object.
+=============+==============+ +=============+=====================+
| Field | URL in Value | | Field | URL in Value |
+=============+==============+ +=============+=====================+
| renewalInfo | Renewal info | | renewalInfo | Renewal information |
+-------------+--------------+ +-------------+---------------------+
Table 1 Table 1
HTTP/1.1 200 OK HTTP/1.1 200 OK
Content-Type: application/json Content-Type: application/json
{ {
"newNonce": "https://acme.example.com/new-nonce", "newNonce": "https://acme.example.com/new-nonce",
"newAccount": "https://acme.example.com/new-account", "newAccount": "https://acme.example.com/new-account",
"newOrder": "https://acme.example.com/new-order", "newOrder": "https://acme.example.com/new-order",
"newAuthz": "https://acme.example.com/new-authz", "newAuthz": "https://acme.example.com/new-authz",
"revokeCert": "https://acme.example.com/revoke-cert", "revokeCert": "https://acme.example.com/revoke-cert",
skipping to change at line 159 skipping to change at line 159
"meta": { "meta": {
"termsOfService": "https://example.com/acme/terms", "termsOfService": "https://example.com/acme/terms",
"website": "https://example.com/acme/docs", "website": "https://example.com/acme/docs",
"caaIdentities": ["example.com"], "caaIdentities": ["example.com"],
"externalAccountRequired": false "externalAccountRequired": false
} }
} }
4. Getting Renewal Information 4. Getting Renewal Information
4.1. The "renewalInfo" Resource 4.1. The RenewalInfo Resource
The "renewalInfo" resource is a new resource type introduced to the The RenewalInfo resource is a new resource type introduced to the
ACME protocol. This new resource allows clients to query the server ACME protocol. This new resource allows clients to query the server
for suggestions on when they should renew certificates. for suggestions on when they should renew certificates.
To request the suggested renewal information for a certificate, the To request the suggested renewal information for a certificate, the
client sends an unauthenticated GET request to a path under the client sends an unauthenticated GET request to a path under the
server's renewalInfo URL. server's renewalInfo URL.
The path component is a unique identifier for the certificate in The path component is a unique identifier for the certificate in
question. The unique identifier is constructed by concatenating the question. The unique identifier is constructed by concatenating the
base64url-encoding [RFC4648] of the keyIdentifier field of the base64url encoding [RFC4648] of the keyIdentifier field of the
certificate's Authority Key Identifier (AKI) [RFC5280] extension, the certificate's Authority Key Identifier (AKI) [RFC5280] extension, the
period character ".", and the base64url-encoding of the DER-encoded period character ".", and the base64url encoding of the DER-encoded
Serial Number field (without the tag and length bytes). All trailing Serial Number field (without the tag and length bytes). All trailing
"=" characters MUST be stripped from both parts of the unique "=" characters MUST be stripped from both parts of the unique
identifier. identifier.
Thus, the full request URL is constructed as follows (split onto Thus, the full request URL is constructed as follows (split onto
multiple lines for readability), where the "||" operator indicates multiple lines for readability), where the "||" operator indicates
string concatenation and the renewalInfo URL is taken from the string concatenation and the renewalInfo URL is taken from the
Directory object: Directory object:
url = renewalInfo || '/' || url = renewalInfo || '/' ||
skipping to change at line 212 skipping to change at line 212
the separator, the unique identifier is therefore the separator, the unique identifier is therefore
aYhba4dGQEHhs3uEe6CuLN4ByNQ.AIdlQyE, and the client makes the aYhba4dGQEHhs3uEe6CuLN4ByNQ.AIdlQyE, and the client makes the
request: request:
GET /renewal-info/aYhba4dGQEHhs3uEe6CuLN4ByNQ.AIdlQyE HTTP/1.1 GET /renewal-info/aYhba4dGQEHhs3uEe6CuLN4ByNQ.AIdlQyE HTTP/1.1
Host: acme.example.com Host: acme.example.com
Accept: application/json Accept: application/json
4.2. RenewalInfo Objects 4.2. RenewalInfo Objects
The structure of an ACME renewalInfo resource is as follows: The structure of an ACME RenewalInfo object is as follows:
suggestedWindow (object, required): suggestedWindow (object, required):
A JSON object with two keys, "start" and "end", whose values are A JSON object with two keys, "start" and "end", whose values are
timestamps, encoded in the format specified in [RFC3339], which timestamps, encoded in the format specified in [RFC3339], which
bound the window of time in which the CA recommends renewing the bound the window of time in which the CA recommends renewing the
certificate. certificate.
explanationURL (string, optional): explanationURL (string, optional):
A URL pointing to a page that may explain why the suggested A URL pointing to a page that may explain why the suggested
renewal window has its current value. For example, it may be a renewal window has its current value. For example, it may be a
skipping to change at line 244 skipping to change at line 244
"start": "2025-01-02T04:00:00Z", "start": "2025-01-02T04:00:00Z",
"end": "2025-01-03T04:00:00Z" "end": "2025-01-03T04:00:00Z"
}, },
"explanationURL": "https://acme.example.com/docs/ari" "explanationURL": "https://acme.example.com/docs/ari"
} }
Clients MUST attempt renewal at a time of their choosing based on the Clients MUST attempt renewal at a time of their choosing based on the
suggested renewal window. The following algorithm is RECOMMENDED for suggested renewal window. The following algorithm is RECOMMENDED for
choosing a renewal time: choosing a renewal time:
1. Query the renewalInfo resource to get a suggested renewal window. 1. Make a renewalInfo request to get a suggested renewal window.
2. Select a uniform random time within the suggested window. 2. Select a uniform random time within the suggested window.
3. If the selected time is in the past, attempt renewal immediately. 3. If the selected time is in the past, attempt renewal immediately.
4. Otherwise, if the client can schedule itself to attempt renewal 4. Otherwise, if the client can schedule itself to attempt renewal
at exactly the selected time, do so. at exactly the selected time, do so.
5. Otherwise, if the selected time is before the next time that the 5. Otherwise, if the selected time is before the next time that the
client would wake up normally, attempt renewal immediately. client would wake up normally, attempt renewal immediately.
skipping to change at line 302 skipping to change at line 302
RenewalInfo after they consider the certificate to be replaced (for RenewalInfo after they consider the certificate to be replaced (for
instance, after a new certificate for the same identifiers has been instance, after a new certificate for the same identifiers has been
received and configured). received and configured).
4.3.1. Server Choice of Retry-After 4.3.1. Server Choice of Retry-After
Servers set the Retry-After header based on their requirements on how Servers set the Retry-After header based on their requirements on how
quickly to perform a revocation. For instance, a server that needs quickly to perform a revocation. For instance, a server that needs
to revoke certificates within 24 hours of notification of a problem to revoke certificates within 24 hours of notification of a problem
might choose to reserve twelve hours for investigation, six hours for might choose to reserve twelve hours for investigation, six hours for
clients to fetch RenewalInfo, and six hours for clients to perform a clients to fetch updated RenewalInfo objects, and six hours for
renewal. Setting a small value for Retry-After means that clients clients to perform a renewal. Setting a small value for Retry-After
can respond more quickly but also incurs more load on the server. means that clients can respond more quickly but also incurs more load
Servers should estimate their expected load based on the number of on the server. Servers should estimate their expected load based on
clients, keeping in mind that third parties may also monitor the number of clients, keeping in mind that third parties may also
RenewalInfo endpoints. monitor renewalInfo endpoints.
4.3.2. Client Handling of Retry-After 4.3.2. Client Handling of Retry-After
After an initial fetch of a certificate's RenewalInfo, clients MUST After an initial fetch of a certificate's RenewalInfo, clients MUST
fetch it again as soon as possible after the time indicated in the fetch it again as soon as possible after the time indicated in the
Retry-After header (backoff on errors takes priority, though). Retry-After header (backoff on errors takes priority, though).
Clients MUST set reasonable limits on their checking interval. For Clients MUST set reasonable limits on their checking interval. For
example, values under one minute could be treated as if they were one example, values under one minute could be treated as if they were one
minute, and values over one day could be treated as if they were one minute, and values over one day could be treated as if they were one
day. day.
skipping to change at line 339 skipping to change at line 339
MUST treat the request as a long-term error. MUST treat the request as a long-term error.
Examples of long-term errors include: Examples of long-term errors include:
* Retry-After is invalid or not present * Retry-After is invalid or not present
* RenewalInfo object is invalid * RenewalInfo object is invalid
* DNS lookup failure * DNS lookup failure
* Connection refused * Connection refused
* Non-5xx HTTP error * Non-5xx HTTP error
On receiving a long-term error, clients MUST perform the next On receiving a long-term error, clients MUST make the next
RenewalInfo fetch as soon as possible after six hours have passed (or renewalInfo request as soon as possible after six hours have passed
some other locally configured default). (or some other locally configured default).
5. Extensions to the Order Object 5. Extensions to the Order Object
In order to convey information regarding which certificate requests In order to convey information regarding which certificate requests
represent renewals of previous certificates, a new field is added to represent renewals of previous certificates, a new field is added to
the Order object: the Order object:
replaces (string, optional): replaces (string, optional):
A string uniquely identifying a previously issued certificate that A string uniquely identifying a previously issued certificate that
this order is intended to replace. This unique identifier is this order is intended to replace. This unique identifier is
constructed in the same way as the path component for GET requests constructed in the same way as the path component for GET requests
described above. described above.
Clients SHOULD include this field in New Order requests if there is a Clients SHOULD include this field in newOrder requests if there is a
clear predecessor certificate, as is the case for most certificate clear predecessor certificate, as is the case for most certificate
renewals. Clients SHOULD NOT include this field if the ACME Server renewals. Clients SHOULD NOT include this field if the ACME server
has not indicated that it supports this protocol by advertising the has not indicated that it supports this protocol by advertising the
renewalInfo resource in its Directory. renewalInfo resource in its Directory.
POST /new-order HTTP/1.1 POST /new-order HTTP/1.1
Host: acme.example.com Host: acme.example.com
Content-Type: application/jose+json Content-Type: application/jose+json
{ {
"protected": base64url({ "protected": base64url({
"alg": "ES256", "alg": "ES256",
skipping to change at line 381 skipping to change at line 381
}), }),
"payload": base64url({ "payload": base64url({
"identifiers": [ "identifiers": [
{ "type": "dns", "value": "acme.example.com" } { "type": "dns", "value": "acme.example.com" }
], ],
"replaces": "aYhba4dGQEHhs3uEe6CuLN4ByNQ.AIdlQyE" "replaces": "aYhba4dGQEHhs3uEe6CuLN4ByNQ.AIdlQyE"
}), }),
"signature": "H6ZXtGjTZyUnPeKn...wEA4TklBdh3e454g" "signature": "H6ZXtGjTZyUnPeKn...wEA4TklBdh3e454g"
} }
Servers SHOULD check that the identified certificate and the New Servers SHOULD check that the identified certificate and the newOrder
Order request correspond to the same ACME Account, that they share at request correspond to the same ACME Account, that they share at least
least one identifier, and that the identified certificate has not one identifier, and that the identified certificate has not already
already been marked as replaced by a different Order that is not been marked as replaced by a different Order that is not "invalid".
"invalid". Correspondence checks beyond this (such as requiring Correspondence checks beyond this (such as requiring exact identifier
exact identifier matching) are left up to Server policy. If any of matching) are left up to server policy. If any of these checks fail,
these checks fail, the Server SHOULD reject the new-order request. the server SHOULD reject the newOrder request. If the server rejects
If the Server rejects the request because the identified certificate the request because the identified certificate has already been
has already been marked as replaced, it MUST return an HTTP 409 marked as replaced, it MUST return an HTTP 409 (Conflict) with a
(Conflict) with a problem document of type "alreadyReplaced" (see problem document of type "alreadyReplaced" (see Section 7.4).
Section 7.4).
If the Server accepts a new-order request with a "replaces" field, it If the server accepts a newOrder request with a "replaces" field, it
MUST reflect that field in the response and in subsequent requests MUST reflect that field in the response and in subsequent requests
for the corresponding Order object. for the corresponding Order object.
This replacement information may serve many purposes, including but This replacement information may serve many purposes, including but
not limited to: not limited to:
* granting New Order requests that arrive during the suggested * granting newOrder requests that arrive during the suggested
renewal window of their identified predecessor certificate higher renewal window of their identified predecessor certificate higher
priority or allowing them to bypass rate limits, if the Server's priority or allowing them to bypass rate limits, if the server's
policy uses such; policy uses such;
* tracking the replacement of certificates that have been affected * tracking the replacement of certificates that have been affected
by a compliance incident, so that they can be revoked immediately by a compliance incident, so that they can be revoked immediately
after they are replaced; and after they are replaced; and
* tying together certificates issued under the same contract with an * tying together certificates issued under the same contract with an
entity identified by External Account Binding. entity identified by External Account Binding.
6. Security Considerations 6. Security Considerations
The extensions to the ACME protocol described in this document build The extensions to the ACME protocol described in this document build
upon the security considerations and threat model defined in upon the security considerations and threat model defined in
Section 10.1 of [RFC8555]. Section 10.1 of [RFC8555].
This document specifies that renewalInfo resources are exposed and This document specifies that RenewalInfo resources are exposed and
accessed via unauthenticated GET requests, a departure from the accessed via unauthenticated GET requests, a departure from the
requirement in RFC 8555 that clients send POST-as-GET requests to requirement in RFC 8555 that clients send POST-as-GET requests to
fetch resources from the server. This is because the information fetch resources from the server. This is because the information
contained in renewalInfo resources is not considered confidential and contained in RenewalInfo resources is not considered confidential and
because allowing renewalInfo to be easily cached is advantageous to because allowing RenewalInfo resources to be easily cached is
shed the load from clients that do not respect the Retry-After advantageous to shed the load from clients that do not respect the
header. As always, servers should take measures to ensure that Retry-After header. As always, servers should take measures to
unauthenticated requests for renewal information cannot result in ensure that unauthenticated requests for renewal information cannot
denial-of-service attacks. These measures might include ensuring result in denial-of-service attacks. These measures might include
that a cache does not include superfluous request headers or query ensuring that a cache does not include superfluous request headers or
parameters in its cache key, instituting IP-based rate limits, or query parameters in its cache key, instituting IP-based rate limits,
other general best-practice measures. or other general best-practice measures.
Note that this protocol could exhibit undesired behavior in the Note that this protocol could exhibit undesired behavior in the
presence of significant clock skew between the ACME client and presence of significant clock skew between the ACME client and
server. For example, if a server places the suggested renewal window server. For example, if a server places the suggested renewal window
wholly in the past to encourage a client to renew immediately, a wholly in the past to encourage a client to renew immediately, a
client with a sufficiently slow clock might nonetheless see the client with a sufficiently slow clock might nonetheless see the
window as being in the future. Similarly, a server that wishes to window as being in the future. Similarly, a server that wishes to
schedule renewals very precisely may have difficulty doing so if some schedule renewals very precisely may have difficulty doing so if some
clients have skewed clocks (or do no implement ARI at all). Server clients have skewed clocks (or do no implement ARI at all). Server
operators should take this concern into account when setting operators should take this concern into account when setting
skipping to change at line 454 skipping to change at line 453
7. IANA Considerations 7. IANA Considerations
7.1. ACME Resource Type 7.1. ACME Resource Type
IANA has added the following entry to the "ACME Resource Types" IANA has added the following entry to the "ACME Resource Types"
registry within the "Automated Certificate Management Environment registry within the "Automated Certificate Management Environment
(ACME) Protocol" registry group at <https://www.iana.org/assignments/ (ACME) Protocol" registry group at <https://www.iana.org/assignments/
acme>: acme>:
+=============+=====================+===============+ +=============+====================+===============+
| Field Name | Resource Type | Reference | | Field Name | Resource Type | Reference |
+=============+=====================+===============+ +=============+====================+===============+
| renewalInfo | Renewal Info object | This document | | renewalInfo | RenewalInfo object | This document |
+-------------+---------------------+---------------+ +-------------+--------------------+---------------+
Table 2 Table 2
7.2. ACME Renewal Info Object Fields 7.2. ACME RenewalInfo Object Fields
IANA has added the following new registry to the "Automated IANA has added the following new registry to the "Automated
Certificate Management Environment (ACME) Protocol" registry group at Certificate Management Environment (ACME) Protocol" registry group at
<https://www.iana.org/assignments/acme>: <https://www.iana.org/assignments/acme>:
Registry Name: Registry Name:
ACME Renewal Info Object Fields ACME RenewalInfo Object Fields
Registration Procedure: Registration Procedure:
Specification Required (see [RFC8126]). The designated expert Specification Required (see [RFC8126]). The designated expert
should ensure that any new fields added to this registry carry should ensure that any new fields added to this registry carry
useful and unique information that does not better belong useful and unique information that does not better belong
elsewhere in the ACME protocol. elsewhere in the ACME protocol.
Template: Template:
Field name: The string to be used as a field name in the JSON Field name: The string to be used as a field name in the JSON
object object
 End of changes. 25 change blocks. 
58 lines changed or deleted 57 lines changed or added

This html diff was produced by rfcdiff 1.48.