【发布时间】:2015-12-04 09:58:46
【问题描述】:
我正在使用Ebay python sdk 消费Ebay Trading APIs,它最终会使用python-requests 进行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 上有很多相关的问题,都说:
- 传递参数验证=假
- 通过CA证书
- 在cacert.pem file 中附加您的 CA 证书(我试过了,没用)
我不能这样做,因为:
- requests 正在被我的 virtualenvirinent 中的第三方库调用。
- 从安全角度来看,这很糟糕。
还有,
- 我可以使用请求在同一个虚拟环境中进行其他 TSL 调用(例如亚马逊市场 API),这不会导致握手错误或任何其他 SSL 错误。
- Ebay SDK 在我的本地系统 (Mac OsX) 上运行良好,仅在我的生产服务器 (Google Cloud/Debian) 上出现问题
- Chrome 在我的域上没有报告 SSL 错误
我不知道为什么会这样。
当我禁用 SSL3 时,为什么 SSL routines', 'SSL3_GET_SERVER_CERTIFICATE', 'certificate verify failed' 处于回溯状态。 (我对 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
【问题讨论】:
-
没有这样的代码可显示,我只是调用execute method 的Connection Class。您可以查看我粘贴在问题中的回溯。
标签: python django ssl python-requests ebay-api