【发布时间】:2014-04-20 14:14:11
【问题描述】:
我尝试在Quickstart for requests中执行第一个命令:
>>> import requests
>>> r = requests.get('https://github.com/timeline.json')
但我收到以下错误消息:
Traceback (most recent call last):
File "./main.py", line 16, in <module>
requests.get('https://github.com/timeline.json')
File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/requests/api.py", line 55, in get
return request('get', url, **kwargs)
File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/requests/api.py", line 44, in request
return session.request(method=method, url=url, **kwargs)
File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/requests/sessions.py", line 383, in request
resp = self.send(prep, **send_kwargs)
File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/requests/sessions.py", line 486, in send
r = adapter.send(request, **kwargs)
File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/requests/adapters.py", line 385, in send
raise SSLError(e)
requests.exceptions.SSLError: [Errno 1] _ssl.c:499: error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed
我对 SSL 证书完全陌生,但我怀疑这与 Python 找错地方有关。我下载了 Python 2.7 并将其用作我的默认 Python(我正在运行 Python 2.6 附带的 Mac OSX 10.6 (Snow Leopard))。在我修复路径并建立符号链接之前,我的 Mac 在错误的地方寻找 Python 内容时遇到了很多麻烦,但我想知道是否还有其他与导致此 SSL 错误的升级有关的东西?或者它可能是与此无关的东西。
我尝试搜索类似的questions 并阅读了一些人的建议,只是为了在requests.get() 中添加参数verify=False,但我不想这样做,因为我认为这只是避免了真正的问题。感谢您帮助一个完整的新手。
【问题讨论】:
-
请检查您是否有文件 /Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/requests/cacert.pem 。这是它应该用于验证的 CA 文件。
-
@SteffenUllrich,是的,它就在那里。
-
然后您可能会检查(使用 dtruss?)它是否被使用,或者它是否正在其他地方寻找 cacert.pem 文件。如果它被使用,请确保“DigiCert High Assurance EV Root CA”(sha-1 5f:b7:ee:06:33:e2:59:db:ad:0c:4c:9a:e6:d3:8f:1a :61:c7:dc:25) 在文件中,因为这是签署 github.com 证书的 CA。当然,如果您在进行 SSL 拦截的防火墙后面,所有这些都是无用的,因为这样您就无法获得原始证书。
-
@SteffenUllrich 这里有同样的问题。我摆脱了防病毒软件,以防万一它阻止了任何东西。奇怪的是,当我执行“openssl s_client -connect some-domain.com:443 -CAfile cert.pem”时,它工作正常。另外,我听从了你的建议,并在命令行上尝试了这个。 "dtruss -a python -c "导入请求; requests.get('some-domain-with-ssl.com');""。结果得到了pastebin.com/8ac3nawu
-
这在你的 druss 输出中并不多,python 内部没有任何系统调用。我不知道在 Mac OSX 上进行系统调用跟踪的正确工具,但在 BSD 中,这是 ktrace 和 Linux strace。如果你想从 python 脚本中获取系统调用,也许你还有一些额外的选择。至于openssl:它是否对请求库中的cacert.pem 起作用,即它不仅连接,而且还明确给出
Verify return code: 0 (ok)?
标签: python macos python-2.7 ssl