WARNING: THIS SITE IS A MIRROR OF GITHUB.COM / IT CANNOT LOGIN OR REGISTER ACCOUNTS / THE CONTENTS ARE PROVIDED AS-IS / THIS SITE ASSUMES NO RESPONSIBILITY FOR ANY DISPLAYED CONTENT OR LINKS / IF YOU FOUND SOMETHING MAY NOT GOOD FOR EVERYONE, CONTACT ADMIN AT ilovescratch@foxmail.com
Skip to content

Commit 2aed374

Browse files
author
Cliff Jansen
committed
PROTON-2856: allow trusted intermediate CA verification using OpenSSL
1 parent 636ddf4 commit 2aed374

File tree

13 files changed

+153
-1
lines changed

13 files changed

+153
-1
lines changed

INSTALL.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ Linux dependencies
2020
- GNU Make 3.81+
2121
- GCC 9+
2222
- Cyrus SASL 2.1+ (for SASL support)
23-
- OpenSSL 1.0+ (for SSL support)
23+
- OpenSSL 1.0.2a+ (for SSL support)
2424
- JsonCpp 1.8+ for C++ connection configuration file support
2525

2626
Windows dependencies

c/src/ssl/PLATFORM_NOTES.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,10 @@ of the certificate's name. See
2121
[here](https://www.openssl.org/docs/ssl/SSL_CTX_load_verify_locations.htm)
2222
for more details.
2323

24+
Proton uses the OpenSSL X509_V_FLAG_PARTIAL_CHAIN flag during peer verification.
25+
All certificates included in a CA database, including those for intermediate
26+
Certificate Authorities, will be treated as potential trust anchors by OpenSSL.
27+
2428

2529
SChannel
2630
========

c/src/ssl/openssl.c

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -555,6 +555,10 @@ static bool pni_init_ssl_domain( pn_ssl_domain_t * domain, pn_ssl_mode_t mode )
555555
return false;
556556
};
557557

558+
// Support intermediate/subordinate CAs as trust anchors.
559+
X509_STORE* store = SSL_CTX_get_cert_store(domain->ctx);
560+
X509_STORE_set_flags(store, X509_V_FLAG_PARTIAL_CHAIN);
561+
558562
const long reject_insecure =
559563
SSL_OP_NO_SSLv2
560564
| SSL_OP_NO_SSLv3

c/src/tls/openssl.c

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -858,6 +858,10 @@ static bool pni_init_ssl_domain( pn_tls_config_t * domain, pn_tls_mode_t mode )
858858
return false;
859859
};
860860

861+
// Support intermediate/subordinate CAs as trust anchors.
862+
X509_STORE* store = SSL_CTX_get_cert_store(domain->ctx);
863+
X509_STORE_set_flags(store, X509_V_FLAG_PARTIAL_CHAIN);
864+
861865
const long reject_insecure =
862866
SSL_OP_NO_SSLv2
863867
| SSL_OP_NO_SSLv3

python/tests/proton_tests/ssl.py

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -229,6 +229,30 @@ def test_server_authentication(self):
229229
server.connection.close()
230230
self._pump(client, server)
231231

232+
def test_intermediate_ca(self):
233+
""" Ensure an intermediate/subordinate certificate can be used as a CA for validation.
234+
"""
235+
if os.name == "nt":
236+
raise Skipped("Test of OpenSSL X509_V_FLAG_PARTIAL_CHAIN flag.")
237+
self.server_domain.set_credentials(self._testpath("server-certificate-ca2.pem"),
238+
self._testpath("server-private-key-ca2.pem"),
239+
"server-password")
240+
241+
self.client_domain.set_trusted_ca_db(self._testpath("subca-certificate.pem"))
242+
self.client_domain.set_peer_authentication(SSLDomain.VERIFY_PEER)
243+
244+
server = SslTest.SslTestConnection(self.server_domain, mode=Transport.SERVER)
245+
client = SslTest.SslTestConnection(self.client_domain)
246+
247+
client.connection.open()
248+
server.connection.open()
249+
self._pump(client, server)
250+
assert client.ssl.get_cert_subject() is not None
251+
assert client.transport.condition is None
252+
client.connection.close()
253+
server.connection.close()
254+
self._pump(client, server)
255+
232256
def test_certificate_fingerprint_and_subfields(self):
233257
if os.name == "nt":
234258
raise Skipped("Windows support for certificate fingerprint and subfield not implemented yet")

python/tests/proton_tests/ssl_db/mkcerts.sh

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,18 @@ keytool -ext san=dns:alternate.name.one.com,dns:another.name.com -storetype pkcs
4343
keytool -ext san=dns:alternate.name.one.com,dns:another.name.com -storetype pkcs12 -keystore ca.pkcs12 -storepass ca-password -alias ca -keypass ca-password -gencert -rfc -validity 99999 -infile server-wc-request.pem -outfile server-wc-certificate.pem
4444
openssl pkcs12 -nocerts -passin pass:server-password -in server-wc.pkcs12 -passout pass:server-password -out server-wc-private-key.pem
4545

46+
# Create a certificate for a subordinate (intermediate) CA certificate issued by the root CA
47+
keytool -storetype pkcs12 -keystore subca.pkcs12 -storepass subca-password -alias subca-certificate -keypass subca-password -keyalg RSA -genkey -dname "O=Trust Me Inc.,CN=Trusted.CA.com level 2 CA" -validity 99999
48+
keytool -storetype pkcs12 -keystore subca.pkcs12 -storepass subca-password -alias subca-certificate -keypass subca-password -certreq -file subca-request.pem
49+
keytool -storetype pkcs12 -keystore ca.pkcs12 -storepass ca-password -alias ca -keypass ca-password -gencert -rfc -validity 99999 -infile subca-request.pem -outfile subca-certificate.pem -ext bc:c=ca:true -ext ku:c=digitalSignature,keyCertSign
50+
51+
# Create a certificate request for a server certificate signed by the subordinate CA.
52+
keytool -storetype pkcs12 -keystore server-ca2.pkcs12 -storepass server-password -alias server-certificate -keypass server-password -keyalg RSA -genkey -dname "O=Server,CN=serverbyca2.domain.com" -validity 99999
53+
keytool -storetype pkcs12 -keystore server-ca2.pkcs12 -storepass server-password -alias server-certificate -keypass server-password -certreq -file server-request-ca2.pem
54+
keytool -storetype pkcs12 -keystore subca.pkcs12 -storepass subca-password -alias subca-certificate -keypass subca-password -gencert -rfc -validity 99999 -infile server-request-ca2.pem -outfile server-certificate-ca2.pem -ext bc:c=ca:false
55+
openssl pkcs12 -nocerts -passin pass:server-password -in server-ca2.pkcs12 -passout pass:server-password -out server-private-key-ca2.pem
56+
57+
4658
# Create pkcs12 versions of the above certificates (for Windows SChannel)
4759
# The CA certificate store/DB is created without public keys.
4860
# Give the "p12" files the same base name so the tests can just change the extension to switch between platforms.
2.46 KB
Binary file not shown.
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
-----BEGIN CERTIFICATE-----
2+
MIIDPjCCAiagAwIBAgIETH/jWTANBgkqhkiG9w0BAQsFADA8MSIwIAYDVQQDExlU
3+
cnVzdGVkLkNBLmNvbSBsZXZlbCAyIENBMRYwFAYDVQQKEw1UcnVzdCBNZSBJbmMu
4+
MCAXDTI0MTAyOTE2MzUyNVoYDzIyOTgwODEzMTYzNTI1WjAyMR8wHQYDVQQDExZz
5+
ZXJ2ZXJieWNhMi5kb21haW4uY29tMQ8wDQYDVQQKEwZTZXJ2ZXIwggEiMA0GCSqG
6+
SIb3DQEBAQUAA4IBDwAwggEKAoIBAQCAkuroiKjCUTgbwtWmMj8B7M0dIpc5mdyI
7+
Dd1Fb6WwEiicuqj0cHYzcCmPimJBuGKUSbLyxUWwha725Dfc9HOZIrLsBSIdE9C4
8+
liyYn62d6J2KNVDIIMzcFujSMYJjoyL9p2iTXyaaulwHtEfHtiOWSMGryr38FqJD
9+
ww/c9hJfqCVD1HoLhQolPj/JJ0ksNWZuCaq//j/ejfH8WRwHY2wP2sjEa8rYhEnU
10+
derfs+yW44FDtjJzWmRn9W3SzUS5QFJ4uJ26mUzB3RpxQV6BSsK90Cd/NipiDhNr
11+
p3r2J5PjblgKEENoE7apUkPmQgWlUSQx4ol4RA9yDJJjHMU68fLlAgMBAAGjUDBO
12+
MB8GA1UdIwQYMBaAFDNmLOL72gohr3C2bnth7HT88Pw3MAwGA1UdEwEB/wQCMAAw
13+
HQYDVR0OBBYEFP/V44xYE8qPQ0211umWbVciKe1wMA0GCSqGSIb3DQEBCwUAA4IB
14+
AQByHSor8RP88Ii0c5PVLvrsvgXT/Kf9uQDAzt5Kq4q2W91zMYNdqAo8FURXoFCK
15+
oN6Zu7hgTUjXYjqBWmA4KozpMzxFQeTY+IYGNq/lskQebjE9gWGS4QJD2vOacypp
16+
a8SkzRKqpyTMNLvOgyteUwQ5oZE7HTGmxIP/tRuhsgjnSZZwUQLftd8BgCGj0e8O
17+
46CXSmTzmxWyQf02PNkyDdoZAiBMgx0L4MpuDjYfM9lQWBn5+Sh0o0H4icml6rFD
18+
HmubbLElFaCrF4qN/8e25TCkMgn3dWP6ITQUjSKtp6TXxevrv4PD4wtapvPUpMDE
19+
7myoawP0qOlXq4jhYqQsvio+
20+
-----END CERTIFICATE-----
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
Bag Attributes
2+
friendlyName: server-certificate
3+
localKeyID: 54 69 6D 65 20 31 37 33 30 32 31 39 37 32 34 31 37 31
4+
Key Attributes: <No Attributes>
5+
-----BEGIN ENCRYPTED PRIVATE KEY-----
6+
MIIFHDBOBgkqhkiG9w0BBQ0wQTApBgkqhkiG9w0BBQwwHAQIO2cXV6kdWUkCAggA
7+
MAwGCCqGSIb3DQIJBQAwFAYIKoZIhvcNAwcECEJoje0kvByWBIIEyHu2jG1GIGCC
8+
69Z4bIgwSORPXdXiH+DIw3JD+lifOjBOGo4FIQQDTYeCwp4y3aBS/40ad4Gv1nSk
9+
N9wrbMjghaqkAwshNoKWJIM+YBvpeFb87gGQKzCiwBJkYeX3sqiiQAwoSOyL6eiN
10+
oEtZUfJlV5kN9OwCnD4HuOdrwVGmj3iB9rPfXZe/KLXAlf5awK7y2bRi1Gq3PVOt
11+
px+ToT9qGOx+JsEd1JlQjEJL09KdE87LxEp8SLzWl0hSMecgmyfp5EQ68ESg+x0t
12+
DiM58DaSSP0f0HBK4q08a49kxp2puQsq2+lHy2iobNrhB5VUKRKfcALIAOkgPJK6
13+
xKMSMyEZTf03cnK3TUDPcLM4oKnXqkSoqZqO1adIXSii18Msb+aHVwKjsfpOTQFD
14+
cexj2TJmClVfZHDdnUrAfyNS2PRR7U0OjJ/wWJtSAdIP3lpV0N9s5Xmp7uHRAmcq
15+
Q3XDdc5U1iGG+VsfqSQT61kXE/61UgZHZntbfYs/xfxt1ZGCqXVrk+gqYfoHAZpl
16+
Xq6BYX8s5Ea+o5GR5zEZZvcYEiWPNhgGrRqkSi/UIRHAAK8xmtIJooOPUw/D38aZ
17+
MF1IGiZTZPJMTv8SVn73FEPLJyj3JpTNs7Zwok15pT/BpEHuP09LzR5J4KiepAwW
18+
meL6qDFLms7Hl/MIkociqlXcePUCUp2GtyP5s8e4us/+cv4kOxVUY0g//9j2UOgz
19+
FwZGoqfyclcQ+PeXAn4qesMQe0F2PLroQUXhEwAUvb6kZZg9Lak7u8wbsaE08JWO
20+
Z24St2PTPtE53ogTPUtNtpm5Un/MdgytpXnzMJnG2StJfDklIlXco8oxzrM3ATXp
21+
a+/uSfUcLJ7Y/ibDd5XOtTtMJLEBoYGMjOPavm5u72nNcdJEsrEBmaDXcipeW0bu
22+
/LiaA5g2NEvo5sH6ntPfjhHpcj8uxDlxVxlO4RHOWk9BtvVA6dYLsTM21nyy5pp1
23+
AM1iuKexfuVkFOK9gnfU1o81hxuRJl62iXxJciBfjkCjxI7iyFCD9BoJ4YHgAXAv
24+
W3ixItVcN9l2yIk9gOvYwQbQ0j9j/m1JD99YvLBIxqUaxX3KzghIZBqzEeLnXbdq
25+
ul1DO+vO4mm+ZnYGaj0YRjmmZXKOElsHlQ/fw1rGfGssnBTnbuTZvII+SGIcPJ3N
26+
EdhVLb2B22jw9PaxdNNQd+5xIdceg5c8aB8zSBb0rrGuqLPzM0fs2+zkj7fRpLvR
27+
L2qB2QWki5GBAKpN+4kGHGDD1XgFfeA2vBkizt92gqbUSly4ifSJZz55S5BESrAd
28+
bzO/ZxIKQb4imatQiQT7JemRteNfxYN3JKaRcvh45OMA8urUFvP91iZt2bFY+asQ
29+
Fw4YWogNmvWICnM8NMYp3WRpBizOGFTm14kxKfdbOrInZpStYx8EHHwS78a44iSH
30+
6/kjK8z+OaCuhC29xVjQkJal8X0qODR0ImDJtnXiHCv0cV8aYM2WiwXUGrGRFOIE
31+
LbQ4GkfeaOzhsKYovb5oD6OX3mWTOQ36TkoEHzDc25iqvJtmx9upnHcZ57F+k9iI
32+
JHGF9Lja4w1hlwEt5Wp0oVdHPuWnptzHkHAF846Bc6z2YkqvZ0jWaW0Rd6FlNz3O
33+
nI6Z5TjPvDRbsjsDRpuhQw==
34+
-----END ENCRYPTED PRIVATE KEY-----
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
-----BEGIN NEW CERTIFICATE REQUEST-----
2+
MIICpzCCAY8CAQAwMjEfMB0GA1UEAxMWc2VydmVyYnljYTIuZG9tYWluLmNvbTEP
3+
MA0GA1UEChMGU2VydmVyMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA
4+
gJLq6IiowlE4G8LVpjI/AezNHSKXOZnciA3dRW+lsBIonLqo9HB2M3Apj4piQbhi
5+
lEmy8sVFsIWu9uQ33PRzmSKy7AUiHRPQuJYsmJ+tneidijVQyCDM3Bbo0jGCY6Mi
6+
/adok18mmrpcB7RHx7YjlkjBq8q9/BaiQ8MP3PYSX6glQ9R6C4UKJT4/ySdJLDVm
7+
bgmqv/4/3o3x/FkcB2NsD9rIxGvK2IRJ1HXq37PsluOBQ7Yyc1pkZ/Vt0s1EuUBS
8+
eLiduplMwd0acUFegUrCvdAnfzYqYg4Ta6d69ieT425YChBDaBO2qVJD5kIFpVEk
9+
MeKJeEQPcgySYxzFOvHy5QIDAQABoDAwLgYJKoZIhvcNAQkOMSEwHzAdBgNVHQ4E
10+
FgQU/9XjjFgTyo9DTbXW6ZZtVyIp7XAwDQYJKoZIhvcNAQELBQADggEBAD+kJpkF
11+
iVCh/xVk1fpwwk0U+c2WYqRY0xPgeryEdA7kxiINtoNevKFed6hr+nfmnksP4XM+
12+
snIiAW05MkIw9xf7L9pgN22NNbjPZGCC1WTNy4pvR5r/fuOj1bMXQKL1xnBk9gBC
13+
m42cFJ0W59bF7KVR1v2wdNBoleU60JW4KMMxUgqav4KUHuysRcGBPEcNrk03TYuO
14+
y3BMLtzLT0ivRfbeMV4P0jajDRfefPFtognXTngVEgFlbAZVI+aPc0k5mJ5LIK00
15+
suZsu+AsXHylrONfqdElZbmOkqxUD69GwtlTbB7zR+DNlOaxJOU8vFgKMsK0YJfZ
16+
rUQPaRS37zg7FrI=
17+
-----END NEW CERTIFICATE REQUEST-----

0 commit comments

Comments
 (0)