我上周遇到了最近的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仍然没有识别证书。
答案 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
。
您可以将证书路径验证通过证书的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。这是下载页面上列出的第二个证书。