【问题标题】:keep getting SSL error when making a get request in python在python中发出get请求时不断收到SSL错误
【发布时间】:2017-01-18 18:59:07
【问题描述】:

我正在做一个简单的获取请求,如下所示:

import requests

response = requests.get('url')

它会出现以下输出错误:

Traceback (most recent call last):
File "/usr/lib/python3.6/site-packages/requests/packages/urllib3/contrib/pyopenssl.py", line 417, in wrap_socket
cnx.do_handshake()
File "/usr/lib/python3.6/site-packages/OpenSSL/SSL.py", line 1426, in do_handshake
self._raise_ssl_error(self._ssl, result)
File "/usr/lib/python3.6/site-packages/OpenSSL/SSL.py", line 1174, in _raise_ssl_error
_raise_current_error()
File "/usr/lib/python3.6/site-packages/OpenSSL/_util.py", line 48, in exception_from_error_queue
raise exception_type(errors)
OpenSSL.SSL.Error: [('SSL routines', 'ssl3_get_server_certificate', 'certificate verify failed')]

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
File "/usr/lib/python3.6/site-packages/requests/packages/urllib3/connectionpool.py", line 594, in urlopen
chunked=chunked)
File "/usr/lib/python3.6/site-packages/requests/packages/urllib3/connectionpool.py", line 350, in _make_request
self._validate_conn(conn)
File "/usr/lib/python3.6/site-packages/requests/packages/urllib3/connectionpool.py", line 835, in _validate_conn
conn.connect()
File "/usr/lib/python3.6/site-packages/requests/packages/urllib3/connection.py", line 323, in connect
ssl_context=context)
File "/usr/lib/python3.6/site-packages/requests/packages/urllib3/util/ssl_.py", line 324, in ssl_wrap_socket
return context.wrap_socket(sock, server_hostname=server_hostname)
File "/usr/lib/python3.6/site-packages/requests/packages/urllib3/contrib/pyopenssl.py", line 424, in wrap_socket
raise ssl.SSLError('bad handshake: %r' % e)
ssl.SSLError: ("bad handshake: Error([('SSL routines', 'ssl3_get_server_certificate', 'certificate verify failed')],)",)

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
File "/usr/lib/python3.6/site-packages/requests/adapters.py", line 423, in send
timeout=timeout
File "/usr/lib/python3.6/site-packages/requests/packages/urllib3/connectionpool.py", line 624, in urlopen
raise SSLError(e)
requests.packages.urllib3.exceptions.SSLError: ("bad handshake: Error([('SSL routines', 'ssl3_get_server_certificate', 'certificate verify failed')],)",)

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/lib/python3.6/site-packages/requests/api.py", line 70, in get
return request('get', url, params=params, **kwargs)
File "/usr/lib/python3.6/site-packages/requests/api.py", line 56, in request
return session.request(method=method, url=url, **kwargs)
File "/usr/lib/python3.6/site-packages/requests/sessions.py", line 488, in request
resp = self.send(prep, **send_kwargs)
File "/usr/lib/python3.6/site-packages/requests/sessions.py", line 609, in send
r = adapter.send(request, **kwargs)
File "/usr/lib/python3.6/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')],)",)
>>>

我知道要避免这种情况,我可以简单地禁用验证,但这绝对不是正确的做法,也不是要走的路,所以我想知道是否有其他更好的解决方法。

我会感谢任何帮助!

编辑:

https://www.ssllabs.com 上运行测试后,我发现服务器的证书链不完整,但我完全不知道如何处理这个问题。

【问题讨论】:

    标签: python python-3.x ssl python-requests pyopenssl


    【解决方案1】:

    我记得他们有类似的东西:

    requests.get(URL, verify='/path/to/certfile')
    

    你可以检查

    http://docs.python-requests.org/en/master/user/advanced/#ssl-cert-verification

    找到进行证书验证的正确方法。

    【讨论】:

    • 我完全忘了提及它,但我要访问的不是我的网站。我只是在写一个原始的抓取工具,它应该从网站上抓取一些信息。据我了解,首先我必须检索证书并将其保存在文件中,对吗?我尝试使用openssl s_client -connect {HOSTNAME}:{PORT} -showcerts 执行此操作,但它没有说“没有可用的对等证书”和“SSL 握手已读取 0 字节并写入 0 字节”...
    • 嗯,如果您不测试自己的网站,我觉得事情会变得更容易。那么为什么不直接做requests.get(url, verify=False)呢?如果您要在他们的网站上获取信息,我认为您不需要进行证书验证,除非他们要求您在获取信息之前登录?
    • 也许你可以看看这个问题stackoverflow.com/questions/24457408/… 或者对你的openssl失败再做一些谷歌。
    • @Albert 还有,如果可能的话,你能告诉我你想从哪个网站获取信息吗?
    • 好吧,到目前为止,我已经搜索了很多东西,但不幸的是没有找到解决方案……也许这与我不太了解 openssl 和所有相关的东西都有效。好吧,从我读到的内容来看,设置verify=False 并不安全,如果信息定期而不是一次,我的报废工具会报废同一块。是的,网站就是这个metro-cc.ru
    猜你喜欢
    • 1970-01-01
    • 2014-06-11
    • 1970-01-01
    • 2017-06-22
    • 2015-08-30
    • 2022-01-07
    • 1970-01-01
    • 2022-01-06
    • 1970-01-01
    相关资源
    最近更新 更多