On Fri, Oct 20, 2023 at 4:07 PM David Benjamin <david...@chromium.org>
wrote:

> Thanks for the comments! Responses inline.
>
> On Thu, Oct 19, 2023 at 3:17 PM Ilari Liusvaara <ilariliusva...@welho.com>
> wrote:
>
>> Some quick thoughts:
>>
>> - The multiple certificates from one ACME order really scares me. It
>>   seems to me that can lead to all sorts of trouble.
>>
>
> Certainly open to different mechanisms, though could you elaborate on
> the trouble? We started with this one because it's actually just fixing a
> mechanism ACME *already has*. RFC 8555, 7.4.2 has this bit:
>
>    The server MAY provide one or more link relation header fields
>    [RFC8288] with relation "alternate".  Each such field SHOULD express
>    an alternative certificate chain starting with the same end-entity
>    certificate.  This can be used to express paths to various trust
>    anchors.  Clients can fetch these alternates and use their own
>    heuristics to decide which is optimal.
>
> https://datatracker.ietf.org/doc/html/rfc8555#section-7.4.2
>
> Whether anyone has ever used this, I don't know. The "and use their own
> heuristics to decide which is optimal" bit is quite absurd. :-) Relative to
> that, all we've done is:
>
> - Go ahead and define some format for a chain + properties... I like PEM
> much, but hey if ACME does that, we can just mimick that.
>

Sorry, I meant to write "I *don't* like PEM much". :-)


> - Fix the heuristic. You don't need heuristics when you have robust
> negotiation.
>
> But I suspect we'll want to define one where you make multiple orders too.
> That would probably work better for, e.g., Merkle Tree certs where the two
> issuances complete at very different times. But then, conversely, when the
> two paths actually share an end-entity certificate, I imagine a single
> order would be better so the CA knows it only needs to generate one
> signature. And then when they don't share an end-entity certificate but are
> similar enough in lifetime and issuance time, either seems fine, so we
> figured this was a reasonable starting point.
>
>
>> - If there can be only one certificate, one could send all the chains
>>   in one go via fist sending the certificate, then issuer chains each
>>   ended by entry describing the trust anchor.
>>
>
> I'm not quite sure if I've parsed this right, but are you thinking of one
> file that somehow describes all alternatives together? That's plausible
> too. Like I said, we mostly did this one because ACME already did it, so we
> inferred that was The ACME Way. :-)
>
>
>> - The latest version and previous version stuff seems pretty confusing
>>   to me.
>>
>
> Yeah, it took us many iterations to find a good way to describe it, and
> I'm sure we haven't gotten it right yet. It's all to deal with version skew
> cleanly, when the relying party references a newer trust store than what
> the subscriber knew about at the time the certificate was issued. Since it
> seems your suggestion below relates to this, maybe some of the discussion
> below will help us clear it up and get to a better description?
>
>
>> - I am not sure this is useful for the client->server direction.
>>
>
> Eh, it costs ~nothing to define it in both directions, just a global
> s/client/relying party/ and s/server/subscriber/ across the document. :-) I
> figure we may as well define it in both directions, and if some client
> certificate deployments find it useful, cool. On the Chrome side, if the
> operating systems could give us something like this, with pre-made paths
> and unambiguous rules for when to send each, I would be overjoyed. We spend
> quite a lot of time helping people debug misconfigurations and quirks
> around client certificate selection.
>
>
>> What I think is a simpler version that might work:
>>
>>
>> Information from root program to CA:
>>
>> - Root program name.
>> - For each trust anchor:
>>   * Trust anchor certificate.
>>   * First version TA appeared in.
>>   * Expiry time
>>   * List of indices.
>>
>> Indices can be reused after all TAs using those have expired.
>>
>>
>> Information from CA to TLS server for each TA:
>>
>> - For each root program:
>>   * Root program name
>>   * The first version TA appeared in.
>>   * List of indices.
>>
>> CA MUST NOT include entries that expire before the certificate.
>>
>>
>> Information from TLS client to TLS server:
>>
>> - Root program name.
>> - Root program version.
>> - List of revoked indices.
>>
>> The revoked indices specifies TAs that have been recently removed
>> before expiry (there could still be unexpired certificates out
>> there).
>>
>>
>> Chain is usable if it includes an entry where:
>>
>> a) Root program name matches, AND
>> b) Root program version is at least the first version, AND
>> c) Intersection of indices and revoked indices is empty.
>>
>> If TLS server has multiple configured certificates, it should skip ones
>> that have no usable chains. If no certificate has usable chain, it
>> should act like the extension was not sent.
>>
>
> If I'm parsing this right, I think the main issue here is this presumes a
> removed CA will stop issuing certificates:
>
> Suppose some CA is in v2 and then was removed in v3. We need to ensure
> certificates issued by that CA don't match a v3 client, so the server will
> send a different one. Immediately after removal, there are plenty of
> existing certs that predate v3's definition, so the relying party needs to
> ship in exclusion. However, we would like the exclusion to eventually fall
> off, or every historical removal will be sent in every ClientHello ever.
>
> If the CA ceases operation, the exclusions can be dropped then. But the CA
> may have good reasons to keep issuing. Consider root rotation. Unupdated
> clients won't trust the new root, and servers may still need to work with
> those clients for a long period of time. The CA may quite reasonably wish
> to continue issuing from that root until that is no longer the case. This
> may even happen during a distrust: it could be that one population of
> clients no longer trusts the CA, while another population of clients
> (perhaps some unupdatable devices somewhere) *only* trusts that CA.
> Servers that need to serve both populations could then deploy a different
> certificate for each, in which case the removed CA might continue issuing.
> It only takes *one* population of relying parties for it to be useful to
> keep issuing from that CA. And as long as *any* server has certificates
> from that CA installed, we need to account for them in cert selection
> somehow.
>
> The way to square this is to have both a lower bound *and* an optional
> upper bound. If the CA knows it in v1, v2, but not v3 onwards, it can tell
> the server this. Once you add the upper bound, I *think* your sketch is
> basically our design (though I may have missed something). The main
> difference is rather than store a range in manifest and inclusion list,
> we've just listed each version individually. If you've got a
> latest_version_at_issuance entry, it means the range has no upper bound.
>
> We listed them out because that makes versions a bit more independent,
> which allows the root program to adjust its label allocations over time.
> For example, maybe the root program later decides it'd be useful to mark
> CAs that use some algorithm. Or perhaps some keys changed hands and we'd
> like to reflect that in the labels. Now, there's a little subtlety here
> because label changes take some time to be reliable. But after max_age +
> max_lifetime, all certificates will have the new information available.
> (Before then, the trust expression creation process will just tell you that
> you need to account for both old and new entries, so you may need to add a
> few more labels.) Also, when we went to describe the root program
> operation, it was much more straightforward to just talk about versions as
> independent, with minimal cross-talk between them.
>
> Of course, labels probably won't change between versions much, so a range
> scheme would make the list more compact. We didn't go with that just
> because the exploded one was less complicated. We did some estimates and it
> didn't look like the compression was actually needed, so we omitted it.
> (These are not sent in TLS connections, just in the root program -> CA ->
> subscriber flow. We don't want them to be *humongous*, but we don't need
> to squeeze them that tightly.) But if folks prefer ranges, that's easy
> enough to add.
>
>
>
>> > ---------- Forwarded message ---------
>> > From: <internet-dra...@ietf.org>
>> > Date: Thu, Oct 19, 2023 at 11:36 AM
>> > Subject: New Version Notification for
>> draft-davidben-tls-trust-expr-00.txt
>> > To: Bob Beck <b...@google.com>, David Benjamin <david...@google.com>,
>> Devon
>> > O'Brien <asymmet...@google.com>
>> >
>> > Name:     draft-davidben-tls-trust-expr
>> > Revision: 00
>> > Title:    TLS Trust Expressions
>> > Date:     2023-10-19
>> > Group:    Individual Submission
>> > Pages:    35
>> > URL:
>> > https://www.ietf.org/archive/id/draft-davidben-tls-trust-expr-00.txt
>> > Status:
>> https://datatracker.ietf.org/doc/draft-davidben-tls-trust-expr/
>> > HTML:
>> > https://www.ietf.org/archive/id/draft-davidben-tls-trust-expr-00.html
>> > HTMLized:
>> > https://datatracker.ietf.org/doc/html/draft-davidben-tls-trust-expr
>>
>>
>>
>>
>> -Ilari
>>
>> _______________________________________________
>> TLS mailing list
>> TLS@ietf.org
>> https://www.ietf.org/mailman/listinfo/tls
>>
>
_______________________________________________
TLS mailing list
TLS@ietf.org
https://www.ietf.org/mailman/listinfo/tls

Reply via email to