对于两个基本相同的系统(都运行 Fedora 25,都安装了相似的软件包版本),一个系统因 SSL 证书验证错误而失败,而另一个系统则没有。也就是说,如果我运行:
import requests
r = requests.get('https://insidehost.corp.example.com')
一个系统可以工作,而另一个系统会失败:
requests.exceptions.SSLError: ("bad handshake: Error([('SSL routines', 'ssl3_get_server_certificate', 'certificate verify failed')],)",)
起初我认为我只是缺少必要的 CA 证书,但运行 python understrace
表明在失败的系统上,python从未尝试打开 ca bundle。也就是说,在有效的系统上:
strace -e trace=open,stat python testscript.py |& grep /etc/pki
仅收益:
open("/etc/pki/tls/legacy-settings", O_RDONLY) = -1 ENOENT (No such file or directory)
stat("/etc/pki/tls/certs/ca-bundle.crt", {st_mode=S_IFREG|0444, st_size=257079, ...}) = 0
open("/etc/pki/tls/certs/ca-bundle.crt", O_RDONLY) = 4
但是在失败的系统上产生:
open("/etc/pki/tls/legacy-settings", O_RDONLY) = -1 ENOENT (No such file or directory)
python3
此外,在失败的系统上运行相同的测试脚本......有效!
在这两种情况下,python
都/usr/bin/python
来自python-2.7.13-1.fc25.x86_64
。两个系统都没有设置任何*_CA_BUNDLE
环境变量。