Python使用系统SSL证书?

时间:2015-06-01 15:29:17

标签: python ssl curl authorize.net

我上周遇到了最近的Authorize.net SSL证书失效debacle

我终于能够卷曲接受他们的证书了:

$ 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 个答案:

答案 0 :(得分:3)

您没有提及您正在使用的操作系统或安装证书的位置,以使其可供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证书已由&#34; Entrust证书颁发机构签署 - L1K&#34;证书,由&#34;委托根证书颁发机构签署 - G2&#34;证书,由&#34;委托根证书颁发机构签署&#34;证书。您作为entrust_ssl_ca.crt安装的证书是&#34; Entrust.net安全服务器证书颁发机构&#34;,它是以上所有&#34;。

我只是访问http://www.entrust.com/get-support/ssl-certificate-support/root-certificate-downloads/并下载所有内容,但上述链中的顶级证书是this one。这是下载页面上列出的第二个证书。