解决“ ssl证书验证失败”错误
在Windows Vista SP2 + Python
2.7.10上,我可以连接到https://www.python.org,但不能连接到https://codereview.appspot.com
剧本:
HOST1 = 'https://www.python.org'
HOST2 = 'https://codereview.appspot.com'
import urllib2
print HOST1
urllib2.urlopen(HOST1)
print HOST2
urllib2.urlopen(HOST2)
并输出:
E:\>py test.py
https://www.python.org
https://codereview.appspot.com
Traceback (most recent call last):
File "test.py", line 9, in <module>
urllib2.urlopen(HOST2)
File "C:\Python27\lib\urllib2.py", line 158, in urlopen
return opener.open(url, data, timeout)
File "C:\Python27\lib\urllib2.py", line 435, in open
response = self._open(req, data)
File "C:\Python27\lib\urllib2.py", line 453, in _open
'_open', req)
File "C:\Python27\lib\urllib2.py", line 413, in _call_chain
result = func(*args)
File "C:\Python27\lib\urllib2.py", line 1244, in https_open
context=self._context)
File "C:\Python27\lib\urllib2.py", line 1201, in do_open
raise URLError(err)
urllib2.URLError: <urlopen error [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:590)>
如何解决问题,https://codereview.appspot.com/到底有什么问题?
-
我的猜测是,它与OpenSSL中的替代链处理有关,如Python Urllib2 SSL
error中详细描述。尽管Python使用Windows
CA存储来获取受信任的根证书,但是信任链本身的验证是在OpenSSL中完成的。根据“发布的Python
2.7.10”,Windows上的Python 2.7.10包含OpenSSL
1.0.2a,但有关替代链的修复仅在1.0.2b中完成(此后必须快速修复,因为它们包含严重的安全漏洞)。如果查看codereview.appspot.com的SSLLabs报告,您会发现存在多个信任链,很可能会导致问题。与此相反,python.org只有一个信任链。
要变通解决此问题,可能需要使用您自己的根CA存储,该存储必须包含“ / C = US / O = Equifax / OU =
Equifax安全证书颁发机构”的证书,才能正确验证codereview.appspot.com。可以在此处找到该证书,并且可以将其与cafile参数一起提供给该证书urllib2.urlopen
。