Python请求,异常,SSL错误:EOF发生违反方案

gmol1639  于 2023-01-31  发布在  Python
关注(0)|答案(9)|浏览(205)

我将从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)

我被这个问题难住了。有人能帮我吗?谢谢!

vjhs03f7

vjhs03f71#

这件事为我工作,只是要确保这些模块是否安装或没有,如果没有然后安装它们,以下是:

pip install ndg-httpsclient

pip install pyopenssl

pip install pyasn1

它删除了我的SSL错误:EOF发生违反协议(_ssl. c:590)错误。
希望有帮助。

ulydmbyx

ulydmbyx2#

我发现它应该直接连接到服务器时却在通过代理。
我通过以下方式解决了这个问题

unset https_proxy
fv2wmkja

fv2wmkja3#

步骤1:检查Python是否支持TLS 1.1

您可能有一个Python设置,它只支持TLS 1.0 -不支持TLS 1.1或更高版本。
您可以按如下方式进行检查:

巨蟒3

from urllib.request import urlopen
urlopen('https://www.howsmyssl.com/a/check').read()

巨蟒2

from urllib2 import urlopen
urlopen('https://www.howsmyssl.com/a/check').read()

(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***)

import ssl
urlopen('https://www.howsmyssl.com/a/check', context=ssl._create_unverified_context()).read()

检查键tls_version的输出。如果它显示TLS 1.0而不是TLS 1.1TLS 1.2,则可能是问题所在。
如果您使用的是virtualenv,请确保在其中运行该命令。

步骤2:使用较新版本的OpenSSL安装Python

为了支持TLS 1.1或更高版本,你可能需要安装一个新版本的OpenSSL,然后再安装Python,这样你的Python应该支持TLS 1.1。
这个过程取决于您的操作系统-这里有一个OS X的指南。

虚拟环境用户

对我来说,我的virtualenv之外的Python支持TLS 1.2,所以我只是删除了我的旧virtualenv,用相同的包创建了一个新的,然后它就工作了。

lymgl2op

lymgl2op4#

我有完全相同的错误,原来我没有安装ndg-httpsclient,见我原来的issue提出的github。

vbopmzt1

vbopmzt15#

如果中间请求出现此错误,可以参考https://github.com/requests/requests/issues/3391中提到的解决方案。
基本上,如果您向服务器发出了很多请求,并且其中一些请求遇到了这个问题,那么您可以使用Session来重试这些请求。
如果管用就告诉我。

t2a7ltrp

t2a7ltrp6#

请关闭代理,然后重试。

t1qtbnec

t1qtbnec7#

我唯一一次看到这种性质的错误是我使用requests来抓取屏幕数据,我使用的是一个多处理库,我要么在没有池管理器的情况下尝试你的代码,要么把你的应用分成两个应用,一个分发url,另一个使用url。
客户端-服务器对here应该给予你一些启发。当我使用hacky服务器代码将所有url加载到app.run之前的一个队列中时,我能够水平扩展我的客户端。希望这能有所帮助。

rwqw0loc

rwqw0loc8#

ENV:Python 3.10www.howsmyssl.com返回tls_version: TLS 1.3
对于像我这样必须通过代理进行查询的可怜人来说,这个云应该归咎于你不正确的HTTPS代理设置(也许你没有设置它,但是python不知何故相信你已经设置了它,不知道为什么,也许是因为你已经设置了http代理),你需要“正确”地设置它。
我用的是windows10,之前没有设置,set it之后,python工作正常,给予吧。

shyt4zoc

shyt4zoc9#

尝试到运行:pip安装urllib3==1.25.11
反正对我有用。

相关问题