Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Remove DNS-02, elaborate on security benefits #45

Open
wants to merge 1 commit into
base: main
Choose a base branch
from
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
95 changes: 6 additions & 89 deletions draft-ietf-acme-scoped-dns-challenges.mkd
Original file line number Diff line number Diff line change
Expand Up @@ -66,15 +66,11 @@ Furthermore, since each domain only has a single authorization label, it creates

In multi-region deployments, where separate availability zones serve the same content, and dependencies across them are avoided, operators need a way to obtain a separate certificate per zone, for the same domain name. Similarly, in cases of zero-downtime migration, two different setups of the infrastructure may coexist for a long period of time, and both need access to valid certificates.

This document specifies two new challenge types. `dns-02` and `dns-account-01`, which aim to address these deficiencies.
This document specifies the `dns-account-01` validation method, which aim to address these deficiencies.
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
This document specifies the `dns-account-01` validation method, which aim to address these deficiencies.
This document specifies the `dns-account-01` validation method, which aims to address these deficiencies.


This work follows all recommendations set forth in "Domain Control Validation using DNS" [I-D.draft-ietf-dnsop-domain-verification-techniques].

This RFC does not intend to deprecate the `dns-01` challenge specified in {{!RFC8555}}. Since these new challenges do not modify any pre-existing challenges, the ability to complete the `dns-02` or `dns-account-01` challenge requires ACME server operators to deploy new changes to their codebase. This makes adopting and using these challenges an opt-in process.

## DNS-02

The `dns-02` challenge adds onto `dns-01` by introducing a scoping mechanism to the domain authorization label. This allows for the client to specify if the intended domain validation is for a specific host, a wildcard domain, or a domain and all of its subdomains.
This RFC does not intend to deprecate the `dns-01` challenge specified in {{!RFC8555}}. Since these new challenges do not modify any pre-existing challenges, the ability to complete the `dns-account-01` challenge requires ACME server operators to deploy new changes to their codebase. This makes adopting and using these challenges an opt-in process.
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
This RFC does not intend to deprecate the `dns-01` challenge specified in {{!RFC8555}}. Since these new challenges do not modify any pre-existing challenges, the ability to complete the `dns-account-01` challenge requires ACME server operators to deploy new changes to their codebase. This makes adopting and using these challenges an opt-in process.
This RFC does not intend to deprecate the `dns-01` challenge specified in {{!RFC8555}}. The `dns-account--01` challenge requires ACME server operators to deploy new changes to their codebase and is an opt-in process.

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Plural "challenges" was used a few times in these sentences. I also find it a bit awkward so I tried to simplify the text without losing meaning. I think there is still room for improvement on it. Feel free to further edit.


## DNS-ACCOUNT-01

Expand All @@ -87,82 +83,6 @@ With this new challenge, domain validation of the same DNS name can be done thro

{::boilerplate bcp14-tagged}

# DNS-02 Challenge

When the identifier being validated is a domain name, the client can prove control of that domain by provisioning a `TXT` resource record containing a designated value for a specific validation domain name.

* type (required, string): The string "dns-02".
* token (required, string): A random value that uniquely identifies the challenge. This value MUST have at least 128 bits of entropy. It MUST NOT contain any characters outside the base64url alphabet, including padding characters ("="). See {{!RFC4086}} for additional information on additional requirements for secure randomness.

~~~
{
"type": "dns-02",
"url": "https://example.com/acme/chall/i00MGYwLWIx",
"status": "pending",
"token": "ODE4OWY4NTktYjhmYS00YmY1LTk5MDgtZTFjYTZmNjZlYTUx"
}
~~~

A client can fulfill this challenge by performing the following steps:

- Construct a key authorization {{!RFC8555, Section 8.1}} from the `token` value provided in the challenge and the client's account key
- Compute the SHA-256 digest {{FIPS180-4}} of the key authorization
- Construct the validation domain name by specifying the scope for the domain name being validated:

"_acme-" || <SCOPE> || "-challenge"

- SCOPE is
- "host" if the associated authorization applies only to the specific host name and no labels beneath it
- "wildcard" if the associated authorization is for a wildcard domain and contains the `wildcard` field set to true ({{?RFC8555, Section 7.1.4}})
- "domain" if the authorization is for both the host and all subdomains by containing the `subdomainAuthAllowed` field set to true ({{?RFC9444, Section 4.1}}).
- The `"||"` operator indicates concatenation of strings

- Provision a DNS `TXT` record with the base64url digest value under the constructed domain validation name

For example, if the domain name being validated is the wildcard of `*.example.org` then the client would provision the following DNS record:

~~~
_acme-wildcard-challenge.example.org 300 IN TXT "LoqXcYV8...jxAjEuX0.9jg46WB3...fm21mqTI"
~~~

(In the above, "..." indicates that the token and the JWK thumbprint in the key authorization have been truncated to fit on the page.)

- Respond to the ACME server with an empty object ({}) to acknowledge that the challenge can be validated by the server

~~~
POST /acme/chall/Rg5dV14Gh1Q
Host: example.com
Content-Type: application/jose+json

{
"protected": base64url({
"alg": "ES256",
"kid": "https://example.com/acme/acct/evOfKhNU60wg",
"nonce": "SS2sSl1PtspvFZ08kNtzKd",
"url": "https://example.com/acme/chall/Rg5dV14Gh1Q"
}),
"payload": base64url({}),
"signature": "Q1bURgJoEslbD1c5...3pYdSMLio57mQNN4"
}
~~~

On receiving a response, the server constructs and stores the key authorization from the challenge `token` value.

To validate the `dns-02` challenge, the server performs the following steps:

- Compute the SHA-256 digest {{FIPS180-4}} of the stored key authorization
- Compute the validation domain name with the scope of the associated authorization similar to the client
- Query for `TXT` records for the validation domain name
- Verify that the contents of one of the `TXT` records match the digest value

If all the above verifications succeed, then the validation is successful. If no DNS record is found, or DNS record and response payload do not pass these checks, then the server MUST fail the validation and mark the challenge as invalid.

The client SHOULD de-provision the resource record(s) provisioned for this challenge once the challenge is complete, i.e., once the "status" field of the challenge has the value "valid" or "invalid".

## Errors

The server SHOULD follow the guidelines set in {{!RFC8555, Section 6.7}} for error conditions that occur during challenge validation.

# DNS-ACCOUNT-01 Challenge

When the identifier being validated is a domain name, the client can prove control of that domain by provisioning a `TXT` resource record containing a designated value for a specific validation domain name.
Expand Down Expand Up @@ -253,7 +173,9 @@ As this challenge creates strong dependency on the `kid` account identifier, the

These challenges follow the recommendations set out in "Domain Control Validation using DNS" {{I-D.draft-ietf-dnsop-domain-verification-techniques}} for supporting multiple intermediates within the context of {{!RFC8555}}.

In both `dns-account-01` and `dns-02`, the same security considerations apply for the integrity of authorizations ({{!RFC8555, Section 10.2}}) and DNS security ({{!RFC8555, Section 11.2}}) as in the original specification for `dns-01`. They both differ from `dns-01` in that the challenges are scoped to the particular name being validated without relying upon CAA ({{!RFC8659}}).
The new `dns-account-01` challenge shares the same security considerations as the original `dns-01` specification regarding the integrity of authorizations {{!RFC8555, Section 10.2}} and DNS security {{!RFC8555, Section 11.2}}.

The `dns-account-01` challenge differs from the original specification by scoping the challenge to the specific name being validated, without relying on CAA records {{!RFC8659}}. This modification enables an ACME client to verify and validate an ACME server's operations with respect to the DNS names it queries.
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
The `dns-account-01` challenge differs from the original specification by scoping the challenge to the specific name being validated, without relying on CAA records {{!RFC8659}}. This modification enables an ACME client to verify and validate an ACME server's operations with respect to the DNS names it queries.
The `dns-account-01` challenge differs from the `dns-01` challenge by scoping the authorization to the specific name being validated, without relying on CAA records {{!RFC8659}}. This modification enables an ACME client to verify and validate an ACME server's operations with respect to the DNS names it queries.

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This modification enables an ACME client to verify and validate an ACME server's operations with respect to the DNS names it queries.

This alone does not verify the server is performing correctly and only grants authorization to the intended identifier or performs its job ultimately correctly according to policy? I am not sure I fully understand the benefit.

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think we could pull/reference language from the "best practice" draft depending on what we keep.


## DNS-ACCOUNT-01

Expand All @@ -267,14 +189,9 @@ The first 10 bytes were picked as a tradeoff: the value needs to be short enough

## ACME Validation Method

The "ACME Validation Methods" registry is to be updated to include the following entries:
The "ACME Validation Methods" registry is to be updated to include the following entry:

~~~
label: dns-02
identifier-type: dns
ACME: Y
Reference: This document

label: dns-account-01
identifier-type: dns
ACME: Y
Expand Down
Loading