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. - 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