我将从ABB G13网关检索一些信息,该网关提供RESTful JSON API。API由网关通过https端点托管。基本身份验证机制用于身份验证。然而,所有流量都通过SSL层。
在Linux上,使用命令:
curl -s -k -X GET -u user:password https://host/meters/a_serial/power
一切顺利!
我尝试用Python 2.7.10编写一个Windows脚本,其中包含Requests 2.8.1和以下代码:
import requests
requests.get('https://host/meters/a_serial/power', auth=('user', 'password'))
我有这个错误:
Traceback (most recent call last):
File "C:/Users/mzilio/PycharmProjects/pwrgtw/test.py", line 20, in <module>
requests.get('https://host/meters/a_serial/power', auth=('user', 'password'))
File "C:\Python27\lib\site-packages\requests\api.py", line 69, in get
return request('get', url, params=params, **kwargs)
File "C:\Python27\lib\site-packages\requests\api.py", line 50, in request
response = session.request(method=method, url=url, **kwargs)
File "C:\Python27\lib\site-packages\requests\sessions.py", line 468, in request
resp = self.send(prep, **send_kwargs)
File "C:\Python27\lib\site-packages\requests\sessions.py", line 576, in send
r = adapter.send(request, **kwargs)
File "C:\Python27\lib\site-packages\requests\adapters.py", line 433, in send
raise SSLError(e, request=request)
requests.exceptions.SSLError: EOF occurred in violation of protocol (_ssl.c:590)
我已经搜索了一个解决方案,并尝试使用以下代码进行修复:
import requests
from requests.adapters import HTTPAdapter
from requests.packages.urllib3.poolmanager import PoolManager
import ssl
class MyAdapter(HTTPAdapter):
def init_poolmanager(self, connections, maxsize, block=False):
self.poolmanager = PoolManager(num_pools=connections,
maxsize=maxsize,
block=block,
ssl_version=ssl.PROTOCOL_TLSv1)
s = requests.Session()
s.mount('https://', MyAdapter())
s.get('https://host/meters/a_serial/power')
但它对我不起作用,因为我得到这个错误:
Traceback (most recent call last):
File "C:/Users/mzilio/PycharmProjects/pwrgtw/test.py", line 16, in <module>
s.get('https://host/meters/a_serial/power')
File "C:\Python27\lib\site-packages\requests\sessions.py", line 480, in get
return self.request('GET', url, **kwargs)
File "C:\Python27\lib\site-packages\requests\sessions.py", line 468, in request
resp = self.send(prep, **send_kwargs)
File "C:\Python27\lib\site-packages\requests\sessions.py", line 576, in send
r = adapter.send(request, **kwargs)
File "C:\Python27\lib\site-packages\requests\adapters.py", line 433, in send
raise SSLError(e, request=request)
requests.exceptions.SSLError: EOF occurred in violation of protocol (_ssl.c:590)
我被这个问题难住了。有人能帮我吗?谢谢!
9条答案
按热度按时间vjhs03f71#
这件事为我工作,只是要确保这些模块是否安装或没有,如果没有然后安装它们,以下是:
它删除了我的SSL错误:EOF发生违反协议(_ssl. c:590)错误。
希望有帮助。
ulydmbyx2#
我发现它应该直接连接到服务器时却在通过代理。
我通过以下方式解决了这个问题
fv2wmkja3#
步骤1:检查Python是否支持TLS 1.1
您可能有一个Python设置,它只支持TLS 1.0 -不支持TLS 1.1或更高版本。
您可以按如下方式进行检查:
巨蟒3
巨蟒2
(If如果得到
urllib.error.URLError: <urlopen error [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:852)>
,则可能必须禁用证书验证。***注意:这样做将禁用SSL保护,以防止恶意者冒充或拦截该网站的流量-请参阅https://en.wikipedia.org/wiki/Man-in-the-middle_attack***)检查键
tls_version
的输出。如果它显示TLS 1.0
而不是TLS 1.1
或TLS 1.2
,则可能是问题所在。如果您使用的是virtualenv,请确保在其中运行该命令。
步骤2:使用较新版本的OpenSSL安装Python
为了支持TLS 1.1或更高版本,你可能需要安装一个新版本的OpenSSL,然后再安装Python,这样你的Python应该支持TLS 1.1。
这个过程取决于您的操作系统-这里有一个OS X的指南。
虚拟环境用户
对我来说,我的virtualenv之外的Python支持TLS 1.2,所以我只是删除了我的旧virtualenv,用相同的包创建了一个新的,然后它就工作了。
lymgl2op4#
我有完全相同的错误,原来我没有安装
ndg-httpsclient
,见我原来的issue提出的github。vbopmzt15#
如果中间请求出现此错误,可以参考https://github.com/requests/requests/issues/3391中提到的解决方案。
基本上,如果您向服务器发出了很多请求,并且其中一些请求遇到了这个问题,那么您可以使用
Session
来重试这些请求。如果管用就告诉我。
t2a7ltrp6#
请关闭代理,然后重试。
t1qtbnec7#
我唯一一次看到这种性质的错误是我使用
requests
来抓取屏幕数据,我使用的是一个多处理库,我要么在没有池管理器的情况下尝试你的代码,要么把你的应用分成两个应用,一个分发url,另一个使用url。客户端-服务器对here应该给予你一些启发。当我使用hacky服务器代码将所有url加载到
app.run
之前的一个队列中时,我能够水平扩展我的客户端。希望这能有所帮助。rwqw0loc8#
ENV:Python
3.10
,www.howsmyssl.com
返回tls_version: TLS 1.3
:对于像我这样必须通过代理进行查询的可怜人来说,这个云应该归咎于你不正确的HTTPS代理设置(也许你没有设置它,但是python不知何故相信你已经设置了它,不知道为什么,也许是因为你已经设置了http代理),你需要“正确”地设置它。
我用的是windows10,之前没有设置,set it之后,python工作正常,给予吧。
shyt4zoc9#
尝试到运行:pip安装urllib3==1.25.11
反正对我有用。