> I understand "reflect" to mean "echo what the client sent."

Thanks Jacob!  I hadn't thought of interpreting it that way.

I've just done a quick review of other instances of the word "reflect" in the 
document.  I think some instances obviously mean "echo what the client sent" 
(e.g., [1]), whereas other instances seem to mean "send the server's current 
view" (e.g., [2]), and at least one instance combines both of these meanings 
(e.g., [3]).

The context of 'MUST NOT reflect the "externalAccountBinding" field in the 
resulting account object' is...

  'When a CA receives a newAccount request containing an
   "externalAccountBinding" field,'

...which does seem to suggest that "echo what the client sent" is the intended 
meaning of this particular instance of "reflect".

So I'm going to choose to interpret it that way so that I can make forward 
progress.  🙂


> > 1. A client should be permitted to omit "externalAccountBinding" from a 
> > newAccount request when retrieving an existing account from a server that 
> > requires external account binding.  (External account binding is a one-time 
> > operation; as soon as an ACME account and an external account are bound 
> > once, they're bound forever).
>
> ...if you want to do an errata for 1, I'd support it.

I suppose an erratum for 1 might break compatibility with some existing 
EAB-requiring servers, so it's probably best not to.


> > 2. When a client does provide "externalAccountBinding" in a newAccount 
> > request to retrieve an existing account from a server that requires 
> > external account binding, the server should be required to verify that 
> > binding and ensure that it links to the exact same external account to 
> > which the ACME account is already bound.
>
> I'm not enthusiastic about 2.

If a client tries to bind an ACME account that is already bound to external 
account EA1 to a different external account EA2, but the 
"externalAccountBinding" field in that client request is silently ignored, how 
does the client know that (despite the successful account retrieval) their ACME 
account has not been bound to EA2?  My thought was just that it might be better 
to throw an error so that the client is aware.


[1] Section 7.3 says:

  'The server MUST NOT reflect the
   "onlyReturnExisting" field or any unrecognized fields in the
   resulting account object.'

      I think the only place "any unrecognized fields" could have come from is 
the client's request, so this instance of "reflect" seems to mean "echo what 
the client sent".

[2] Section 7.4.1 says:

  'In some cases, a CA running an ACME server might have a completely
   external, non-ACME process for authorizing a client to issue
   certificates for an identifier.  In these cases, the CA should
   provision its ACME server with authorization objects corresponding to
   these authorizations and reflect them as already valid in any orders
   submitted by the client.'

      Since these authorization objects are determined by the ACME server 
without any involvement of an ACME client, this "reflect" seems to mean "send 
the server's current view".


[3] Section 7.4 says:

  'The body of this response is
   an order object reflecting the client's request and any
   authorizations the client must complete before the certificate will
   be issued.'


      The "reflecting the client's request" is obviously "what the client 
sent"; but "reflecting the...authorizations the client must complete" must mean 
"send the server's current view", because those authorizations are determined 
by the server.

________________________________
From: Jacob Hoffman-Andrews <[email protected]>
Sent: 17 November 2020 20:23
To: Rob Stradling <[email protected]>
Cc: [email protected] <[email protected]>
Subject: Re: [Acme] Conflicting requirements for retrieving an ACME account 
that is already bound to an external account


CAUTION: This email originated from outside of the organization. Do not click 
links or open attachments unless you recognize the sender and know the content 
is safe.


I think this is the key bit:

>   - Since the server has not verified the binding, its response 'MUST NOT 
> reflect the "externalAccountBinding" field in the resulting account object'.

I understand "reflect" to mean "echo what the client sent." So I think it's 
acceptable for the server to ignore the externalAccountBind field / not 
re-verify it, and return an account object whose externalAccountBinding field 
is set based on the contents of the CA's database.

> 1. A client should be permitted to omit "externalAccountBinding" from a 
> newAccount request when retrieving an existing account from a server that 
> requires external account binding.  (External account binding is a one-time 
> operation; as soon as an ACME account and an external account are bound once, 
> they're bound forever).
> 2. When a client does provide "externalAccountBinding" in a newAccount 
> request to retrieve an existing account from a server that requires external 
> account binding, the server should be required to verify that binding and 
> ensure that it links to the exact same external account to which the ACME 
> account is already bound.

I think an errata is not needed to make forward progress, but if you want to do 
an errata for 1, I'd support it. I'm not enthusiastic about 2.

In general I think providing the option to look up an account by key was a 
mistake. Clients already have to store one piece of state (the account key), 
and asking them to store a second piece of state (the account URL) is not 
onerous. Particularly in the case where the client is storing both an account 
key and an external account binding, I think it's reasonable to ask that the 
client store the account URL rather than add additional complexity to the 
account-lookup part of the standard.
_______________________________________________
Acme mailing list
[email protected]
https://www.ietf.org/mailman/listinfo/acme

Reply via email to