【问题标题】:SSLError using requests for pythonSSLError 使用对 python 的请求
【发布时间】: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


【解决方案1】:

你可以试试这个。

验证证书的路径:

&gt;&gt;&gt; requests.get('https://whatever.com', verify='/path/to/certfile')

或者

&gt;&gt;&gt; requests.get('https://whatever.com', cert=('/path/server.crt', '/path/key'))

http://docs.python-requests.org/en/latest/user/advanced/

【讨论】:

    猜你喜欢
    • 2015-04-24
    • 2016-02-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多