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 证书?的主要内容,如果未能解决你的问题,请参考以下文章

使用 Python 验证 SSL 证书

如何连接 Python IMAP4_SSL 和自签名服务器 SSL 证书?

Python-requests的使用 - SSL证书验证

如何使用 python 解码 SSL 证书?

确定 SSL 证书是不是使用 Python 自签名

python MySQLdb:在没有证书的情况下使用ssl