In cases where we expect OpenSSL to be validating the chain, we expect that
ISRG Root X1 is also in the trust store (unlike older versions of Android,
where we know that it hasn't been added). As such, there will be two
certificates in the chain which are also in the local trust store: ISRG
Root X1 and the expired DST Root CA X3.

It is my understanding that OpenSSL 1.1.0+, with the `trusted_first` method
as the default chain-building method, will go through the following steps:
1) Receive the chain "EE <-- R3 <-- ISRG Root X1 (cross-signed by DST Root
CA X3)" from the server
2) Look to see if it can complete this chain using certificates from
`-CAfile`, `-CApath`, or `-trusted`
3) See that ISRG Root X1 is already trusted
4) Return this chain, which successfully verifies.

The evidence that this works on OpenSSL 1.1.0+ comes from the very similar
situation this past May. In that case, many servers were serving the chain
"EE <-- Sectigo RSA Domain Validation Secure Server CA <-- USERTrust RSA
Certification Authority <-- AddTrust External CA Root". In that situation,
both the USERTrust RSA Certification Authority and the AddTrust External CA
Root were in various trust stores, and then the AddTrust External CA Root
expired. Clients which were using OpenSSL 1.1.0+ did not begin to fail at
that time, because they were still able to trust the USERTrust RSA
Certification Authority. Clients using OpenSSL 1.0.x were failing, because
they couldn't recognize that one of the intermediates in the chain was in
their own trust store.

If this understanding is incorrect or missing something, we'd love to be
informed.

Thanks again,
Aaron

On Thu, Jan 7, 2021 at 1:10 AM Kurt Roeckx via dev-security-policy <
dev-security-policy@lists.mozilla.org> wrote:

> On 2021-01-07 01:48, Aaron Gable wrote:
> > As mentioned in the blog post, and as we'll elaborate on further in an
> > upcoming post, one of the drawbacks of this arrangement is that there
> > actually is a class of clients for which chaining to an expired root
> > doesn't work: versions of OpenSSL prior to 1.1. This is the same failure
> > mode as various clients ran into on May 30th of 2020, when the AddTrust
> > External CA root expired.
>
> I'm not sure why you mention OpenSSL prior to 1.1. There was a bug in
> 1.1.1h that no longer checked for expired roots, but it was fixed in
> 1.1.1i. OpenSSL has no plan to allow expired roots by default.
>
>
> Kurt
> _______________________________________________
> dev-security-policy mailing list
> dev-security-policy@lists.mozilla.org
> https://lists.mozilla.org/listinfo/dev-security-policy
>
_______________________________________________
dev-security-policy mailing list
dev-security-policy@lists.mozilla.org
https://lists.mozilla.org/listinfo/dev-security-policy

Reply via email to