【问题标题】:Troubleshooting "ssl certificate verify failed" error解决“ssl 证书验证失败”错误
【发布时间】:2015-10-15 05:16:42
【问题描述】:

在 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/ 到底有什么问题?

【问题讨论】:

  • 浏览器对该网站的证书有何评价?
  • @AlexeiLevenkov 浏览器正常 - Chrome 中的绿色锁和 IE8 中的金锁。

标签: python ssl urllib2


【解决方案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 中完成(并且必须在之后快速修复,因为它们包含严重的安全错误)。

如果您查看SSLLabs report for codereview.appspot.com,您会发现有多个可能导致问题的信任链。与之相反,python.org 只有一个信任链。

要解决此问题,可能需要使用您自己的根 CA 存储,该存储必须包含“/C=US/O=Equifax/OU=Equifax Secure Certificate Authority”的证书,以正确验证 codereview.appspot.com .证书可以在here找到,你可以用cafile parameterurllib2.urlopen

【讨论】:

  • 谢谢。我在 Python 2.7.10 中看到 _ssl.pyd 和版本 OpenSSL 1.0.2a 19 Mar 2015,我还没有看到任何新版本。
  • 看来我自己无法重新编译它。可惜python.org不能发布2.7.11或者至少不能独立更新_ssl.pyd
  • @techtonik:就像我建议的那样,您应该能够使用本地 CA 文件。作为一个好的开始,请查看来自 Mozilla 的包,该包可在 python 的格式支持处获得,地址为 curl.haxx.se/docs/caextract.html。但我建议您购买包含 RSA 1024 密钥的旧包,只要您没有可以正确处理多个信任路径的 OpenSSL 版本。
  • 这将为我个人解决问题,但不会帮助codereview.appspot.com的其他用户
  • @SteffenUllrich - 你能解释一下为什么它可以在 Windows 7 上运行吗?
猜你喜欢
  • 2019-09-08
  • 2015-06-05
  • 2015-11-19
  • 1970-01-01
  • 2018-06-07
  • 2018-03-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多