Python 使用系统 SSL 证书?
Posted
技术标签:
【中文标题】Python 使用系统 SSL 证书?【英文标题】:Python using system SSL certificates? 【发布时间】:2015-08-15 03:25:07 【问题描述】:上周我遇到了最近的 Authorize.net SSL 证书失效debacle。
我终于可以让 curl 接受他们的证书了:
$ curl -Iv https://secure.authorize.net
...
* SSL certificate verify ok.
...
但 python 仍然通过请求拒绝它:
>>> requests.get('https://secure.authorize.net', verify=True)
...
InsecurePlatformWarning
在我的代码中:
File "/usr/lib/python2.7/ssl.py", line 405, in do_handshake
self._sslobj.do_handshake()
SSLError: [Errno 1] _ssl.c:510: error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed
谁能告诉我为什么 python 似乎没有使用系统证书进行验证?关于修复的任何想法?
编辑
我正在使用 Ubuntu 并以这种方式安装证书:
sudo curl -o /usr/local/share/ca-certificates/entrust_ssl_ca.crt https://www.entrust.net/downloads/binary/entrust_ssl_ca.cer
sudo update-ca-certificates
运行后,curl正常工作,但python仍然无法识别证书。
【问题讨论】:
【参考方案1】:您没有提及您使用的操作系统或安装证书的位置以使它们可用于 Curl。
我在我的系统上使用了strace
来查看 Python 在哪里寻找证书。在我的 Fedora 系统上,Python 使用/etc/pki/tls/certs/ca-bundle.crt
,这是 Fedora、Red Hat 和类似系统上的标准位置。
在 Ubuntu 上,Python 正在查找 /etc/ssl/certs/ca-certificates.crt
。
根据the documentation:
您可以使用以下证书验证 CA_BUNDLE 文件的路径 受信任的 CA。这个受信任的 CA 列表也可以通过 REQUESTS_CA_BUNDLE 环境变量。
...这样您就可以为您的应用程序提供一个独立于系统上安装的 CA 证书的列表。
更新
运行openssl s_client -showcerts -connect secure.authorize.net:443
显示*.authorize.net
证书由“Entrust证书颁发机构-L1K”证书签名,该证书由“Entrust Root证书颁发机构-G2”证书签名,该证书由“Entrust Root”签名证书颁发机构”证书。您作为entrust_ssl_ca.crt
安装的证书是“Entrust.net Secure Server Certificate Authority”,即“以上都不是”。
我会访问http://www.entrust.com/get-support/ssl-certificate-support/root-certificate-downloads/ 并下载所有内容,但上述链中的***证书是this one。这是下载页面上列出的第二个证书。
【讨论】:
谢谢,我已经更新了我的问题,包括操作系统详细信息以及我如何安装新证书。 不幸的是,我使用的是 python 的 SSL 模块,而不是应用程序代码中的请求。我只是将请求用作可重现的示例。以上是关于Python 使用系统 SSL 证书?的主要内容,如果未能解决你的问题,请参考以下文章