我正在使用使用Ebay python sdk的Ebay Trading API,该API最终会发出python请求以进行API调用。
一切都很好,但是自最近几天以来,我无法拨打电话。我收到错误消息:
SSLError: bad handshake: Error([('SSL routines', 'SSL3_GET_SERVER_CERTIFICATE', 'certificate verify failed')],)
这是完整的回溯:
In [9]: response = api.execute('GetSessionID', data)
---------------------------------------------------------------------------
SSLError Traceback (most recent call last)
<ipython-input-9-eb33610c2a7f> in <module>()
----> 1 response = api.execute('GetSessionID', data)
/home/debian/.virtualenvs/myvirtualenv/local/lib/python2.7/site-packages/ebaysdk/connection.pyc in execute(self, verb, data, list_nodes, verb_attrs, files)
117
118 self.build_request(verb, data, verb_attrs, files)
--> 119 self.execute_request()
120
121 if hasattr(self.response, 'content'):
/home/debian/.virtualenvs/goplaces/local/lib/python2.7/site-packages/ebaysdk/connection.pyc in execute_request(self)
182 proxies=self.proxies,
183 timeout=self.timeout,
--> 184 allow_redirects=True
185 )
186
/home/debian/.virtualenvs/myvirtualenv/local/lib/python2.7/site-packages/requests/sessions.pyc in send(self, request, **kwargs)
574
575 # Send the request
--> 576 r = adapter.send(request, **kwargs)
577
578 # Total elapsed time of the request (approximately)
/home/debian/.virtualenvs/myvirtualenv/local/lib/python2.7/site-packages/requests/adapters.pyc in send(self, request, stream, timeout, verify, cert, proxies)
431 except (_SSLError, _HTTPError) as e:
432 if isinstance(e, _SSLError):
--> 433 raise SSLError(e, request=request)
434 elif isinstance(e, ReadTimeoutError):
435 raise ReadTimeout(e, request=request)
SSLError: bad handshake: Error([('SSL routines', 'SSL3_GET_SERVER_CERTIFICATE', 'certificate verify failed')],)
在StackOverflow上有许多相关的问题,这些问题都表明:
我不能这样做是因为:
还,
我不知道为什么会这样。
SSL routines', 'SSL3_GET_SERVER_CERTIFICATE', 'certificate verify failed'
当我禁用SSL3时,为什么要追溯。(我对SSL没有深入的了解)。
谢谢!
# openssl version
OpenSSL 1.0.2e 3 Dec 2015
通过@Steffen Ullrich的建议从源代码构建,从1.0.1升级到openssl 1.0.2。
$ pip freeze | grep -i ssl
backports.ssl-match-hostname==3.4.0.2
pyOpenSSL==0.15.1
我的猜测是这与Python Urllib2 SSL错误有关,即OpenSSL的基础实现中存在多个信任路径的问题。有关问题的详细信息,请参见此处。
要解决此问题而不更改可信任的CA,您需要具有固定的OpenSSL,即OpenSSL 1.0.2。或者,您可以将一些较旧的CA证书添加回您的信任库。
- 通过参数verify = False
- 通过CA证书
- 将您的CA证书附加到cacert.pem文件中(我尝试了此操作,没有用)
...从安全角度来看这很糟糕。
虽然verify=False
由于禁用验证而对安全性不利,但其他选项也不错,因为它们仅添加其他信任锚,但使验证保持启用状态。
当我禁用SSL3时,为什么要追溯SSL例程,“ SSL3_GET_SERVER_CERTIFICATE”,“证书验证失败”。
即使它谈论SSLv3,也并不意味着它。TLS和SSLv3共享许多功能,即TLS 1.0实际上是SSL 3.1。因此SSL3_*
,OpenSSL代码中的许多功能也与TLS 1.x一起使用,这也会引起这些令人不快的消息。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句