In the course of trying to help a friend with a problem with pip and ssl sites (GitHub issue here), I've become confused about how the High Sierra /usr/bin/openssl finds its certificates. My "keg-only" openssl does not have any trouble with the site.
Here's the test case that I've been playing with:
(alice)[14:22:06]~>>/usr/bin/openssl s_client -connect files.pythonhosted.org:443 | head 2>&1
depth=1 C = BE, O = GlobalSign nv-sa, CN = GlobalSign CloudSSL CA - SHA256 - G3
verify error:num=20:unable to get local issuer certificate
verify return:0
CONNECTED(00000005)
---
Certificate chain
0 s:/C=US/ST=California/L=San Francisco/O=Fastly, Inc/CN=r.ssl.fastly.net
i:/C=BE/O=GlobalSign nv-sa/CN=GlobalSign CloudSSL CA - SHA256 - G3
1 s:/C=BE/O=GlobalSign nv-sa/CN=GlobalSign CloudSSL CA - SHA256 - G3
i:/C=BE/O=GlobalSign nv-sa/OU=Root CA/CN=GlobalSign Root CA
---
Server certificate
-----BEGIN CERTIFICATE-----
^C
I've been scratching my head because an appropriate key resides in the Keychain utility (Determined by downloading the Mozilla cert bundle from the Curl site, finding the one cert that rescues the test case when provided via -CAfile
, and comparing its fingerprint to certs in the Keychain app. See the pip issue for gory details).
The value of OPENSSLDIR
in the openssl version -a
output suggests that /usr/bin/openssl
should be using /private/etc/ssl
:
(alice)[14:05:27]~>>/usr/bin/openssl version -a
LibreSSL 2.2.7
built on: date not available
platform: information not available
options: bn(64,64) rc4(ptr,int) des(idx,cisc,16,int) blowfish(idx)
compiler: information not available
OPENSSLDIR: "/private/etc/ssl"
And, in fact, pointing at that directory with the -CApath
command line option rescues the test case:
(alice)[14:26:32]~>>/usr/bin/openssl s_client -connect files.pythonhosted.org:443 -CApath /private/etc/ssl | head 2>&1 < /dev/null
depth=2 C = BE, O = GlobalSign nv-sa, OU = Root CA, CN = GlobalSign Root CA
verify return:1
depth=1 C = BE, O = GlobalSign nv-sa, CN = GlobalSign CloudSSL CA - SHA256 - G3
verify return:1
depth=0 C = US, ST = California, L = San Francisco, O = "Fastly, Inc", CN = r.ssl.fastly.net
verify return:1
^C
(alice)[15:21:22]~>>
What's going on? Do the CApath/CAfile
commands enable behavior that doesn't otherwise occur?
I'd love to understand what's going on.
-CApath
command line option rescues the test case: [...]" — the terminal output you've provided here is identical to the first case (no-CApath
) and doesn't show success; can you correct this? I assume you're correctly seeingverify return:1
for the entire chain (root cert atdepth=2
as I see it) in this second case?/etc/ssl/
as you suspect (note that/etc
is symlinked to/private/etc
). The default certs all reside there incert.pem
, and additional certs can be stored in/etc/ssl/certs/
. Perhaps check that yourcert.pem
is intact and up to date? For me, running LibreSSL 2.8.3 on macOS Catalina 10.15.2 (19C57), the MD5 hash ofcert.pem
is6cecca9c114e4386b98e1d24a028dd95
.cert.pem
, the GlobalSign root cert can be found starting on line 3018. The cert itself can be seen here: pastebin.com/KZQANumd