请求包在连接到github时引发SSLError

时间:2014-07-11 22:34:56

标签: python ssl python-requests

我想使用requests package访问https://api.github.com/。我尝试了requests.get('https://api.github.com/'),但收到了以下SSL错误:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  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 456, 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 559, in send
    r = adapter.send(request, **kwargs)
  File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/requests/adapters.py", line 382, in send
    raise SSLError(e, request=request)
requests.exceptions.SSLError: [Errno 1] _ssl.c:507: error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed

我正在使用OSX Yosemite Beta 3,python 2.7.6并请求2.3.0。

我知道我可以通过verify=False来忽略错误。但是,我不能这样做,因为我无法修改从中调用请求的代码。

使用openssl openssl s_client -connect github.com:443似乎不会导致问题。

无论如何,请求是否适用于SSL?我的操作系统是否导致问题?我如何提出请求信任GitHub的证书?

1 个答案:

答案 0 :(得分:3)

请求default list of trusted certificates的硬编码。您信任的内容并不重要,只有请求信任的内容。如果您尝试访问的网站未通过其中一个默认设置进行签名,则需要告知请求手动信任的内容。

如果您无权访问库代码,可以verify=<some file>传递tell requests what to trust,或者设置env var REQUESTS_CA_BUNDLE=<some file>

请使用REQUESTS_CA_BUNDLE=my_verify.pem python my_program.py致电您的计划 或其他一些设置env var的方法。

如果您尝试访问https://api.github.com/并且可以使用curl但不是请求来访问它,则可以将请求传递给您的操作系统使用的包。在大多数Linux系统上,它位于/etc/ssl/certs/ca-certificates.crt。你们可以传递一个只包含GitHub公共证书的文件。

要获取给定服务器的证书,请使用命令openssl s_client -showcerts -connect api.github.com:443 < /dev/null | openssl x509 -outform PEM > github.crt。请参阅https://stackoverflow.com/a/16797458/400617


请注意,尽管pip使用请求,但它也会对受信任的默认值列表进行硬编码。要覆盖pip,您需要设置env var PIP_CERT=<some file>。所以请注意,您使用的任何图书馆都可能拥有自己的方式来覆盖它。