故障排除"ssl证书验证失败"错误

3
在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/ 出了什么问题?

浏览器对该网站的证书有何说法? - Alexei Levenkov
@AlexeiLevenkov 浏览器没问题 - Chrome 中是绿色锁,IE8 中是金色锁。 - anatoly techtonik
1个回答

1
我的猜测是它与OpenSSL中的备用链处理有关,详细描述在Python Urllib2 SSL error中。虽然Python使用Windows CA存储获取受信任的根证书,但信任链本身的验证是在OpenSSL内部完成的。
根据"Python 2.7.10 Released",Windows上的Python 2.7.10包括OpenSSL 1.0.2a,但关于备用链的修复仅在1.0.2b中完成(并且后来必须快速修复,因为它们包含了一个严重的安全漏洞)。
如果您查看 codereview.appspot.com 的 SSL 实验室报告,您会发现可能存在多个信任链,这可能会导致问题。相反,python.org 只有一个信任链。
为了解决此问题,可能需要使用自己的根 CA 存储库,其中必须包含 "/C=US/O=Equifax/OU=Equifax Secure Certificate Authority" 的证书以正确验证 codereview.appspot.com。证书可以在 这里 找到,并且您可以将其与 cafile 参数 一起提供给 urllib2.urlopen

谢谢。我在Python 2.7.10中看到了版本为“OpenSSL 1.0.2a 19 Mar 2015”的_ssl.pyd,并且我没有看到任何新版本发布。 - anatoly techtonik
看起来我自己无法重新编译它。遗憾的是,python.org 不能发布2.7.11或至少是“_ssl.pyd”的独立更新。 - anatoly techtonik
@techtonik:就像我之前建议的那样,你应该能够使用本地CA文件。为了一个好的开始,可以查看Mozilla的捆绑包,它可以在Python支持的格式下获得,网址是http://curl.haxx.se/docs/caextract.html。但是我建议你获取旧的捆绑包,其中包括RSA 1024密钥,只要你没有一个可以正确处理多个信任路径的OpenSSL版本。 - Steffen Ullrich
@SteffenUllrich - 你能解释一下为什么它在Windows 7上能够工作吗? - PhistucK
@PhistucK:这很奇怪,但Windows有时会下载缺失的根CA证书,因此一个系统可能与另一个系统不同。如果您想要发布该程序,您可以将所需的根CA证书一并包含在其中,这样您就不必依赖于系统中安装的内容。 - Steffen Ullrich
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接