Thanks Felipe, Jacob, we had not really considered the use case where the 
server would offer challenges for both 
foo.bar.example.org<http://foo.bar.example.com> and 
example.org<http://example.com> and the client could choose which to fulfil.

We assumed (maybe naively) that the server would only offer the Base Domain 
Name challenge (using the CA/B Baseline defn. of the Base Domain Name), and 
also wanted to minimise changes to the protocol and JSON objects.

For flexibility, I guess if the client wants 
foo.bar.example.org<http://foo.bar.example.com> the protocol should also allow 
server choice of offering challenges for (1) both 
foo.bar.example.org<http://foo.bar.example.com> and  
example.com<http://example.com> (2) only the requested identifier 
foo.bar.example.com<http://foo.bar.example.com> or (3) only the parent domain 
example.com<http://example.com>.

I was talking through this with Richard, and there are a few choices for how to 
enhance the authorizations object to allow this. If the server only wants to 
offer one challenge, then that’s straight forward. It includes whatever 
identifier it picks (subdomain or parent) in the authorization object. If it 
wants to include both, here are a few options:

Both option 1. Your suggestion. I think we need new challenges types for the 
parent for each of the supported challenge types e.g. http-parent-01 and 
dns-parent-01.

~~~
   {
     "status": "pending",
     "expires": "2015-03-01T14:09:07.99Z",

     "identifier": {
       "type": "dns",
       "value": "foo.bar.example.org"
     },

     "challenges": [
       {
         "url": "https://example.com/acme/chall/prV_B7yEyA4";,
         "type": "http-01",
         "status": "pending",
         "token": "DGyRejmCefe7v4NfDGDKfA",
       },
       {
         "url": "https://example.com/acme/chall/prV_B7yEyA4";,
         "type": "http-parent-01",
         "parent-identifier":"example.org",
         "status": "pending",
         "token": "DGyRejmCefe7v4NfDGDKfA",
       },
       {
         "url": "https://example.com/acme/chall/prV_B7yEyA4";,
         "type": "dns-parent-01",
         "parent-identifier":"example.org",
         "status": "pending",
         "token": "DGyRejmCefe7v4NfDGDKfA",
       }
     ],
   }
~~~

Both option 2. The challenge for the parent domain is of a new type that 
contains a set of nested challenges of existing types.

~~~
   {
     "status": "pending",
     "expires": "2015-03-01T14:09:07.99Z",

     "identifier": {
       "type": "dns",
       "value": "foo.bar.example.org"
     },

     "challenges": [
       {
         "url": "https://example.com/acme/chall/prV_B7yEyA4";,
         "type": "http-01",
         "status": "pending",
         "token": "DGyRejmCefe7v4NfDGDKfA",
       },
       {
         "url": "https://example.com/acme/chall/PAniVnsZcis";,
         "type": related-identifier",
         "status": "pending",
          "related-identifier":"example.org",
          "challenges":[
                   {
               "url": "https://example.com/acme/chall/prV_B7yEyA4";,
               "type": "http-01",
               "status": "pending",
               "token": "DGyRejmCefe7v4NfDGDKfA",
               },
               {
               "url": "https://example.com/acme/chall/prV_B7yEyA4";,
               "type": "dns-01",
               "status": "pending",
               "token": "DGyRejmCefe7v4NfDGDKfA",
             },
         ]
       }
     ]
   }
~~~

Both option 3. A new challenge type that points to another new authorization 
object. This can be standard authorization obejct that includes http-01, dns-01 
challenges for the parent. It may make sense to also include the parent domain 
in this new challenge, even though it will be in the 2nd authorization.

~~~
   {
     "status": "pending",
     "expires": "2015-03-01T14:09:07.99Z",

     "identifier": {
       "type": "dns",
       "value": "foo.bar.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"
       },
       {
         "url": "https://example.com/acme/chall/PAniVnsZcis";,
         "type": related-identifier",
         "related-identifier":"example.org",
         "related-authorization":"uri"
         "status": "pending"
       }
     ],
   }
~~~

Of all the above, option 3 arguably keeps the client implementation and logic 
as close to base ACME as possible.



From: Acme <[email protected]> On Behalf Of Jacob Hoffman-Andrews
Sent: 05 August 2020 07:53
To: Felipe Gasper <[email protected]>
Cc: [email protected]
Subject: Re: [Acme] ACME subdomains

I haven't followed the "ACME for subdomains" conversation closely, but the base 
semantics of ACME are designed such that they can express "all of" semantics 
AND "one of" semantics. For a given Order, a client has to fulfil all the 
Authorizations; for a given Authorization, a client has to fulfil one of the 
Challenges.

To take advantage of this, you would need to define a new challenge type that 
expresses validating a parent domain. For instance "dns-parent-01." It would 
contain the name of the parent domain as a field.

If a server has the policy that validating control of either 
foo.bar.example.com<http://foo.bar.example.com> or 
example.com<http://example.com> is sufficient to issue for 
foo.bar.example.com<http://foo.bar.example.com>, it would respond to newOrder 
requests for foo.bar.example.com<http://foo.bar.example.com> by creating an 
Order with one Authorization (for 
foo.bar.example.com<http://foo.bar.example.com>), and that Order would have two 
Challenges: "dns-01" and "dns-parent-01" (with a parent domain of 
"example.com<http://example.com>"). The client could then choose which 
challenge to attempt.
_______________________________________________
Acme mailing list
[email protected]
https://www.ietf.org/mailman/listinfo/acme

Reply via email to