【问题标题】:Bad handshake: Error while using request in python握手错误:在 python 中使用请求时出错
【发布时间】:2016-12-20 13:39:53
【问题描述】:

这里我使用请求模块从github下载api信息,代码如下。

# Creation of Github request

# Import requests
import requests

r = requests.get('https://api.github.com/user', auth=('user','pass'))
print(r.status_code)
print(r.headers['content-type'])
print(r.encoding)
print(r.text)
print(r.json())

使用该模块时出现错误

python github.py           
Traceback (most recent call last):
  File "github.py", line 6, in <module>
    r = requests.get('https://api.github.com/user', auth=('user','pass'))
  File "/home/ubuntu/.local/lib/python2.7/site-packages/requests/api.py", line 70, in get
    return request('get', url, params=params, **kwargs)
  File "/home/ubuntu/.local/lib/python2.7/site-packages/requests/api.py", line 56, in request
    return session.request(method=method, url=url, **kwargs)
  File "/home/ubuntu/.local/lib/python2.7/site-packages/requests/sessions.py", line 488, in request
    resp = self.send(prep, **send_kwargs)
  File "/home/ubuntu/.local/lib/python2.7/site-packages/requests/sessions.py", line 609, in send
    r = adapter.send(request, **kwargs)
  File "/home/ubuntu/.local/lib/python2.7/site-packages/requests/adapters.py", line 497, in send
    raise SSLError(e, request=request)
requests.exceptions.SSLError: ("bad handshake: Error([('SSL routines', 'ssl3_get_server_certificate', 'certificate verify failed')],)",)

我尝试过的:

用我的身份验证详细信息替换用户名和密码,它给出了以下错误。

401
application/json; charset=utf-8
utf-8
{"message":"Bad credentials","documentation_url":"https://developer.github.com/v3"}
{u'documentation_url': u'https://developer.github.com/v3', u'message': u'Bad credentials'}

尝试在 github 的设置选项卡中使用访问令牌,但没有用。

有什么帮助吗?请帮我解决这个问题。

还要求在我的系统上安装模块。

【问题讨论】:

  • 您的密码中是否有反斜杠(会很不幸!)
  • certificate verify failed 表示通过 HTTPS(而非 HTTP)获取数据时的自签名证书或错误证书。尝试将您的网址更改为http:// 或修复您的证书。我刚刚注意到您正在获取针对 github.com 的数据,您之间有代理吗?
  • 您的客户端似乎无法验证服务器证书
  • 这可能是 SNI 问题,您可以尝试更新请求吗? pip install -U requests[security]
  • 为什么不使用 Github API 客户端之一?

标签: python python-2.7 python-3.x python-requests


【解决方案1】:
import requests

r = requests.get('https://api.github.com/user', auth=('user','pass'), verify=False)
print(r.status_code)
print(r.headers['content-type'])
print(r.encoding)
print(r.text)
print(r.json())

如果是这种情况,这可能会起作用。那么您在验证从服务器发送的证书时遇到问题(因为您使用的是 HTTPS)。

有一个完整的section about this

Requests 为 HTTPS 请求验证 SSL 证书,就像 Web 浏览器一样。默认开启 SSL 验证,如果无法验证证书,Requests 会抛出 SSLError:

请注意,您不应为生产代码禁用 TLS/SSL 验证,而应调查证书无效的原因并遵循官方文档中的指南。

人工验证

您始终可以从浏览器中导出 github 证书,并将证书放在与您的脚本相同的目录中。现在这通常不需要,但作为测试..这应该工作:

r.get('https://api.github.com', verify='./github.crt')

再次确保您已导出证书并将其作为github.crt 放置在与您的脚本相同的目录中。

【讨论】:

    猜你喜欢
    • 2019-01-10
    • 2018-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多