expiring trust anchor compatibility issue
Affects | Status | Importance | Assigned to | Milestone | |
---|---|---|---|---|---|
openssl (Ubuntu) |
Fix Released
|
Undecided
|
Unassigned | ||
Trusty |
Confirmed
|
Critical
|
Unassigned | ||
Xenial |
Fix Released
|
Critical
|
Steve Beattie |
Bug Description
[Impact]
* openssl fails to talk to letsencrypt website past September 2021, despite trusting the letsencrypt root certificate.
[Test Plan]
* Import staging cert equivalent to ISRG Root X1 https:/
* Import expired staging cert equivalen tto DST Root CA X3
https:/
* Test connectivity to the expired-root-ca test website
https:/
setup:
apt install openssl ca-certificates wget
wget https:/
wget https:/
cat letsencrypt-
test case:
openssl s_client -connect expired-
bad result:
connection failed
verify depth is 1
CONNECTED(00000003)
depth=3 C = US, O = (STAGING) Internet Security Research Group, CN = (STAGING) Doctored Durian Root CA X3
verify error:num=
notAfter=Jan 30 14:01:15 2021 GMT
140672978626200
good result:
connection successful
verify depth is 1
CONNECTED(00000003)
depth=2 C = US, O = (STAGING) Internet Security Research Group, CN = (STAGING) Pretend Pear X1
verify return:1
depth=1 C = US, O = (STAGING) Let's Encrypt, CN = (STAGING) Artificial Apricot R3
verify return:1
depth=0 CN = expired-
verify return:1
---
Certificate chain
0 s:/CN=expired-
i:/C=
1 s:/C=US/O=(STAGING) Let's Encrypt/
i:/C=
2 s:/C=US/O=(STAGING) Internet Security Research Group/CN=(STAGING) Pretend Pear X1
i:/C=
---
Server certificate
-----BEGIN CERTIFICATE-----
Connection should be successful and trusted with correctly working openssl s_client that can manage to ignore expired CA, and build a valid trust path using non-expired CA in the chain.
[Testcase #2]
$ sudo apt install ca-certificates wget faketime
# Good connectivity
$ wget -O /dev/null https:/
--2021-07-13 11:54:20-- https:/
Resolving canonical.com (canonical.com)... 2001:67c:
Connecting to canonical.com (canonical.
HTTP request sent, awaiting response... 200 OK
Length: 30933 (30K) [text/html]
Saving to: '/dev/null'
/dev/null 100%[==
2021-07-13 11:54:20 (22.3 MB/s) - '/dev/null' saved [30933/30933]
# Jump to october to experience failure
$ faketime '2021-10-01' wget -O /dev/null https:/
--2021-10-01 00:00:00-- https:/
Resolving canonical.com (canonical.com)... 2001:67c:
Connecting to canonical.com (canonical.
ERROR: cannot verify canonical.com's certificate, issued by 'CN=R3,O=Let\'s Encrypt,C=US':
Issued certificate has expired.
To connect to canonical.com insecurely, use `--no-check-
# upgrade to new openssl, to see that connectivity is restored, even in october
$ dpkg-query -W libssl1.0.0
libssl1.0.0:amd64 1.0.2g-1ubuntu4.20
$ faketime '2021-10-01' wget -O /dev/null https:/
--2021-10-01 00:00:00-- https:/
Resolving canonical.com (canonical.com)... 2001:67c:
Connecting to canonical.com (canonical.
HTTP request sent, awaiting response... 200 OK
Length: 30933 (30K) [text/html]
Saving to: '/dev/null'
/dev/null 100%[==
2021-10-01 00:00:00 (21.9 MB/s) - '/dev/null' saved [30933/30933]
[Where problems could occur]
* Changes as to how the trust paths are built in TLS connection may result in introducing bugs (failure to connect to valid sites) and/or security vulnerabilities (connecting to invalid sites successfully).
[Other Info]
* Background info
* The current chain from letsencrypt is expiring, they are adding a new chain, but also keeping the expiring one. This will result in connectivity issues when using old gnutls/openssl against websites using the default letsencrypt configuration after September 2021.
https:/
https:/
Currently openssl in xenial and earlier will not establish a connection, if any parts of the trust chain have expired, even though alternative non-expired chains are available.
This has been fixed in OpenSSL 1.1.0+ by setting X509_V_
Note only the new default flag is backported on its own. The other changes to more strongly verify additional auxiliary trust OIDs and key usage are not backported.
gnutls bug for this is https:/
Changed in openssl (Ubuntu): | |
status: | New → Fix Released |
information type: | Public → Public Security |
tags: |
added: letsencryptexpiry removed: letsencrypt |
description: | updated |
description: | updated |
description: | updated |
Changed in openssl (Ubuntu Xenial): | |
importance: | Undecided → Critical |
Changed in openssl (Ubuntu Trusty): | |
importance: | Undecided → Critical |
python3.5 has stopped passing its testsuite due to expried test certs. Thus upload of openssl has triggered regression in python3.5
I've cherrypicked updated test certs and keys, but to cherry-pick those cleanly, I also had to cherrypick an earlier bug fix. All of these are unmodified from 3.5.10 release. With these patches in place python3.5 testsuite passes with both current and proposed update of openssl.