This introduced a regression which caused certificate validation to fail when certificates violate RFC 5280 [1], namely, when a certificate has "basicConstraints=CA:FALSE,pathlen:0". This combination is commonly seen by self-signed leaf certificates with an intermediate CA before the root CA.
Because of this, openssl 1.1.1f rejects these certificates and they cannot be used in the system certificate store, and ssl connections fail when you try to use them to connect to a ssl endpoint.
The error you see when you try verify is:
$ openssl verify -CAfile CA/rootCA_cert.pem -untrusted CA/subCA_cert.pem user1_cert.pem
error 20 at 0 depth lookup: unable to get local issuer certificate
error user1_cert.pem: verification failed
The exact same certificates work fine on Xenial, Bionic and Hirsute.
If you install these test packages, and attempt to verify, things work as planned.
[Where problems could occur]
If a regression were to occur, it would occur around x509 certificate parsing and validation. It may cause certificates which had previously passed to fail, or certificates which failed to pass. It could potentially cause all certificates to fail or pass.
Since this is the openssl package and the package is security-critical, this will need a lot of validation, testing, and likely a review by the security team.
One of the commits which fixes the issue adds two testcases to the openssl testsuite, which tests the "CA:FALSE, pathlen:0" certificates with and without -x509_strict, and tests to see if it passes without, and fails with.
[Impact]
In openssl 1.1.1f, the below commit was merged:
commit ba4356ae4002a04 e28642da60c5518 77eea804f7 cache_extension s and related functions /github. com/openssl/ openssl/ commit/ ba4356ae4002a04 e28642da60c5518 77eea804f7
Author: Bernd Edlinger <email address hidden>
Date: Sat Jan 4 15:54:53 2020 +0100
Subject: Fix error handling in x509v3_
Link: https:/
This introduced a regression which caused certificate validation to fail when certificates violate RFC 5280 [1], namely, when a certificate has "basicConstrain ts=CA:FALSE, pathlen: 0". This combination is commonly seen by self-signed leaf certificates with an intermediate CA before the root CA.
Because of this, openssl 1.1.1f rejects these certificates and they cannot be used in the system certificate store, and ssl connections fail when you try to use them to connect to a ssl endpoint.
The error you see when you try verify is:
$ openssl verify -CAfile CA/rootCA_cert.pem -untrusted CA/subCA_cert.pem user1_cert.pem
error 20 at 0 depth lookup: unable to get local issuer certificate
error user1_cert.pem: verification failed
The exact same certificates work fine on Xenial, Bionic and Hirsute.
[1] https:/ /tools. ietf.org/ html/rfc5280. html
[Testcase]
We will create our own root CA, intermediate CA and leaf server certificate.
Create necessary directories:
$ mkdir reproducer
$ cd reproducer
$ mkdir CA
Write openssl configuration files to disk for each CA and cert:
$ cat << EOF >> rootCA.cnf ed_name
[ req ]
prompt = no
distinguished_name = req_distinguish
x509_extensions = usr_cert
[ req_distinguish ed_name ]
C = DE
O = Test Org
CN = Test RSA PSS Root-CA
[ usr_cert ] keyCertSign, cRLSign ifier = hash ntifier = keyid:always
basicConstraints = critical,CA:TRUE
keyUsage = critical,
subjectKeyIdent
authorityKeyIde
EOF
$ cat << EOF >> subCA.cnf ed_name
[ req ]
prompt = no
distinguished_name = req_distinguish
x509_extensions = usr_cert
[ req_distinguish ed_name ]
C = DE
O = Test Org
CN = Test RSA PSS Sub-CA
[ usr_cert ] CA:TRUE, pathlen: 0 keyCertSign, cRLSign ifier = hash ntifier = keyid:always
basicConstraints = critical,
keyUsage = critical,
subjectKeyIdent
authorityKeyIde
EOF
$ cat << EOF >> user.cnf ed_name
[ req ]
prompt = no
distinguished_name = req_distinguish
x509_extensions = usr_cert
[ req_distinguish ed_name ]
C = DE
O = Test Org
CN = Test User
[ usr_cert ] CA:FALSE, pathlen: 0 digitalSignatur e,keyAgreement serverAuth ifier = hash ntifier = keyid:always
basicConstraints = critical,
keyUsage = critical,
extendedKeyUsage = clientAuth,
subjectKeyIdent
authorityKeyIde
EOF
Then generate the necessary RSA keys and form certificates:
$ openssl genpkey -algorithm RSA-PSS -out rootCA_key.pem -pkeyopt rsa_keygen_ bits:2048 mode:pss -sigopt rsa_pss_saltlen:-1
$ openssl req -config rootCA.cnf -set_serial 01 -new -batch -sha256 -nodes -x509 -days 9125 -out CA/rootCA_cert.pem -key rootCA_key.pem -sigopt rsa_padding_
$ openssl genpkey -algorithm RSA-PSS -out subCA_key.pem -pkeyopt rsa_keygen_ bits:2048 mode:pss -sigopt rsa_pss_saltlen:-1 mode:pss -sigopt rsa_pss_saltlen:-1
$ openssl req -config subCA.cnf -new -out subCA_req.pem -key subCA_key.pem -sigopt rsa_padding_
$ openssl x509 -req -sha256 -in subCA_req.pem -CA CA/rootCA_cert.pem -CAkey rootCA_key.pem -out CA/subCA_cert.pem -CAserial rootCA_serial.txt -CAcreateserial -extfile subCA.cnf -extensions usr_cert -days 4380 -sigopt rsa_padding_
$ c_rehash CA
$ openssl genpkey -algorithm RSA-PSS -out user1_key.pem -pkeyopt rsa_keygen_ bits:2048 mode:pss -sigopt rsa_pss_saltlen:-1 mode:pss -sigopt rsa_pss_saltlen:-1
$ openssl req -config user.cnf -new -out user1_req.pem -key user1_key.pem -sigopt rsa_padding_
$ openssl x509 -req -sha256 -in user1_req.pem -CA CA/subCA_cert.pem -CAkey subCA_key.pem -out user1_cert.pem -CAserial subCA_serial.txt -CAcreateserial -extfile user.cnf -extensions usr_cert -days 1825 -sigopt rsa_padding_
Now, let's try verify the generated certificates:
$ openssl version
OpenSSL 1.1.1f 31 Mar 2020
$ openssl verify -CAfile CA/rootCA_cert.pem -untrusted CA/subCA_cert.pem user1_cert.pem
error 20 at 0 depth lookup: unable to get local issuer certificate
error user1_cert.pem: verification failed
There are test packages available in the following ppa:
https:/ /launchpad. net/~mruffell/ +archive/ ubuntu/ sf308725- test
If you install these test packages, and attempt to verify, things work as planned.
[Where problems could occur]
If a regression were to occur, it would occur around x509 certificate parsing and validation. It may cause certificates which had previously passed to fail, or certificates which failed to pass. It could potentially cause all certificates to fail or pass.
Since this is the openssl package and the package is security-critical, this will need a lot of validation, testing, and likely a review by the security team.
One of the commits which fixes the issue adds two testcases to the openssl testsuite, which tests the "CA:FALSE, pathlen:0" certificates with and without -x509_strict, and tests to see if it passes without, and fails with.
[Other info]
I believe these three commits fix the issue:
commit 00a0da2f021e6a0 bc9519a6a9e5be6 6d45e6fc91 /github. com/openssl/ openssl/ commit/ 00a0da2f021e6a0 bc9519a6a9e5be6 6d45e6fc91
Author: Tomas Mraz <email address hidden>
Date: Thu Apr 2 15:56:12 2020 +0200
Subject: Allow certificates with Basic Constraints CA:false, pathlen:0
Link: https:/
commit 29e94f285f7f05b 1aec6fa275e320b c5fa37ab1e ERR_INVALID_ EXTENSION error for invalid basic constraints /github. com/openssl/ openssl/ commit/ 29e94f285f7f05b 1aec6fa275e320b c5fa37ab1e
Author: Tomas Mraz <email address hidden>
Date: Thu Apr 2 17:31:21 2020 +0200
Subject: Set X509_V_
Link: https:/
commit e78f2a8f269a4dc f820ca994e2b89b 77972d79e1 /github. com/openssl/ openssl/ commit/ e78f2a8f269a4dc f820ca994e2b89b 77972d79e1
Author: Tomas Mraz <email address hidden>
Date: Fri Apr 3 10:24:40 2020 +0200
Subject: Add test cases for the non CA certificate with pathlen:0
Link: https:/
These landed in openssl 1.1.1g, and hirsute already has these fixes.