<p>requests.exceptions.SSLError: EOF 发生违反协议 (_ssl.c:645)</p>

创建于 2016-02-12  ·  77评论  ·  资料来源: psf/requests

这是第一个问题。
https://github.com/kennethreitz/requests/issues/2906

Python 3.5.1 (https://www.python.org/downloads/) Virtualenv 14.0.5 Mac OS X 10.11.3

首先,我创建了一个 virtualenv 和pip install requests[security]

然后我得到了

>>> from cryptography.hazmat.backends.openssl.backend import backend
>>> print(backend.openssl_version_text())
OpenSSL 1.0.2f  28 Jan 2016

这正是我所期望的。

大约一个小时,一切都很好。

然后,我自己的一些脚本崩溃了,这是正常的。 之后,当我再次尝试运行脚本时,出现以下异常

ssl.SSLEOFError: EOF occurred in violation of protocol (_ssl.c:645)

requests.packages.urllib3.exceptions.SSLError: EOF occurred in violation of protocol (_ssl.c:645)

requests.exceptions.SSLError: EOF occurred in violation of protocol (_ssl.c:645)

所以我打开了另一个 Python 控制台

>>> requests.get("https://www.google.com")
<Response [200]>
>>> requests.get("https://www.telegram.org")
Traceback (most recent call last):
  File "VirtualenvPath/lib/python3.5/site-packages/requests/packages/urllib3/connectionpool.py", line 559, in urlopen
    body=body, headers=headers)
  File "VirtualenvPath/lib/python3.5/site-packages/requests/packages/urllib3/connectionpool.py", line 345, in _make_request
    self._validate_conn(conn)
  File "VirtualenvPath/lib/python3.5/site-packages/requests/packages/urllib3/connectionpool.py", line 784, in _validate_conn
    conn.connect()
  File "VirtualenvPath/lib/python3.5/site-packages/requests/packages/urllib3/connection.py", line 252, in connect
    ssl_version=resolved_ssl_version)
  File "VirtualenvPath/lib/python3.5/site-packages/requests/packages/urllib3/util/ssl_.py", line 305, in ssl_wrap_socket
    return context.wrap_socket(sock, server_hostname=server_hostname)
  File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/ssl.py", line 376, in wrap_socket
    _context=self)
  File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/ssl.py", line 747, in __init__
    self.do_handshake()
  File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/ssl.py", line 983, in do_handshake
    self._sslobj.do_handshake()
  File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/ssl.py", line 628, in do_handshake
    self._sslobj.do_handshake()
ssl.SSLEOFError: EOF occurred in violation of protocol (_ssl.c:645)

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "VirtualenvPath/lib/python3.5/site-packages/requests/adapters.py", line 376, in send
    timeout=timeout
  File "VirtualenvPath/lib/python3.5/site-packages/requests/packages/urllib3/connectionpool.py", line 588, in urlopen
    raise SSLError(e)
requests.packages.urllib3.exceptions.SSLError: EOF occurred in violation of protocol (_ssl.c:645)

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "VirtualenvPath/lib/python3.5/site-packages/requests/api.py", line 67, in get
    return request('get', url, params=params, **kwargs)
  File "VirtualenvPath/lib/python3.5/site-packages/requests/api.py", line 53, in request
    return session.request(method=method, url=url, **kwargs)
  File "VirtualenvPath/lib/python3.5/site-packages/requests/sessions.py", line 468, in request
    resp = self.send(prep, **send_kwargs)
  File "VirtualenvPath/lib/python3.5/site-packages/requests/sessions.py", line 576, in send
    r = adapter.send(request, **kwargs)
  File "VirtualenvPath/lib/python3.5/site-packages/requests/adapters.py", line 447, in send
    raise SSLError(e, request=request)
requests.exceptions.SSLError: EOF occurred in violation of protocol (_ssl.c:645)
>>> 

所以我重新启动,卸载了所有这些库并再次 pip 安装它们。 一切都恢复了。

但大约 1 小时后,同样的异常再次出现。

最有用的评论

@the-efi 您是否安装了pyopensslpyasn1ndg-httpsclient

所有77条评论

然后,我自己的一些脚本崩溃了,这是正常的。

像这样的崩溃是什么样的?

之后,当我再次尝试运行脚本时,出现以下异常

之后您是否完全无法运行它们?

@sigmavirus24这只是我自己代码中的一些错误,与网络无关。
我不确定这是真正的原因还是巧合。

但有一件事是肯定的,在某个时刻之后,我完全无法向https://www.telegram.org提出请求,我可以在安装请求后立即进行。

仅供参考:#2906

所以我想指出您正在安装requests[security]这意味着我们应该使用 pyOpenSSL 但您的堆栈跟踪显示我们没有。 这很有趣。

@sigmavirus24所以我有什么可以帮助你的吗?

任何的想法? @卢卡萨

那么这里最重要的是:为什么您的代码停止使用 PyOpenSSL? 当您遇到崩溃时,您能否在您的虚拟环境中打开一个 python 控制台,然后运行import urllib3.contrib.pyopenssl ,看看是否有效?

现在无法重现。 我先关闭这个,如果再遇到问题,我把结果贴出来重新打开。

@Lukasa我认为由于请求随附有自己的 urllib3,因此我无法单独导入 urllib3。 下面的结果证实了这一点。

Python 3.5.1 (v3.5.1:37a07cee5969, Dec  5 2015, 21:12:44) 
[GCC 4.2.1 (Apple Inc. build 5666) (dot 3)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import urllib3.contrib.pyopenssl
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ImportError: No module named 'urllib3'
>>> ^D




pip list
cffi (1.5.0)
cryptography (1.2.2)
idna (2.0)
ndg-httpsclient (0.4.0)
pip (8.0.2)
pyasn1 (0.1.9)
pycparser (2.14)
pyOpenSSL (0.15.1)
requests (2.9.1)
setuptools (20.0)
six (1.10.0)
wheel (0.26.0)

对不起,请尝试导入requests.packages.urllib3.contrib.pyopenssl

@卢卡萨

Python 3.5.1 (v3.5.1:37a07cee5969, Dec  5 2015, 21:12:44) 
[GCC 4.2.1 (Apple Inc. build 5666) (dot 3)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import requests.packages.urllib3.contrib.pyopenssl
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "VirtualenvPath/lib/python3.5/site-packages/requests/packages/urllib3/contrib/pyopenssl.py", line 57, in <module>
    from socket import _fileobject, timeout, error as SocketError
ImportError: cannot import name '_fileobject'
>>> 

我敢打赌,这是 pyOpenSSL 3.5 上的一个错误,我们不知道@lukasa (关于_fileobject不存在。

不,我知道它,并在我们开始测试 PyOpenSSL 时在 urllib3 中提出了上游修复。 现实情况是requests[security]没有(也从来没有)在 Python 3 上工作。这将在即将发布的 Requests 版本中修复。

所以这并没有解决我们的难题:为什么这会起作用然后停止?

基于原始报告的切线评论,python 中的内置 ssl.py 有一个选项可以抑制参差不齐的 EOF,因为有很多站点会不正常地关闭 SSL 连接。 有时不可靠,好像这是时间或巧合的问题。 以下是 ssl.py 的摘录

class SSLSocket(socket):
    [...]
    def read(self, len=0, buffer=None):
        """Read up to LEN bytes and return them.
        Return zero-length string on EOF."""

        self._checkClosed()
        if not self._sslobj:
            raise ValueError("Read on closed or unwrapped SSL socket.")
        try:
            return self._sslobj.read(len, buffer)
        except SSLError as x:
            if x.args[0] == SSL_ERROR_EOF and self.suppress_ragged_eofs:
                if buffer is not None:
                    return 0
                else:
                    return b''
            else:
                raise

在使用gevent下的requests冲击服务器时,在 Python 2.7.11/OSX 上有相同的异常。 这可能有关系吗?

@the-efi 你能更具体地说明你看到的是哪个例外吗?

    r = requests.post(self.MY_URL, data=parameters)
  File "/Users/me/Envs/my_env/lib/python2.7/site-packages/requests/api.py", line 109, in post
    return request('post', url, data=data, json=json, **kwargs)
  File "/Users/me/Envs/my_env/lib/python2.7/site-packages/requests/api.py", line 50, in request
    response = session.request(method=method, url=url, **kwargs)
  File "/Users/me/Envs/my_env/lib/python2.7/site-packages/requests/sessions.py", line 465, in request
    resp = self.send(prep, **send_kwargs)
  File "/Users/me/Envs/my_env/lib/python2.7/site-packages/requests/sessions.py", line 573, in send
    r = adapter.send(request, **kwargs)
  File "/Users/me/Envs/my_env/lib/python2.7/site-packages/requests/adapters.py", line 431, in send
    raise SSLError(e, request=request)
SSLError: EOF occurred in violation of protocol (_ssl.c:590)

@the-efi 您是否安装了pyopensslpyasn1ndg-httpsclient

pyopenssl:否定
pyasn1:pyasn1==0.1.8(我猜是暂时的)
ndg-httpsclient:否定

好的。 您也在运行 Python 2.7,所以您和发布者似乎遇到了不同的问题。

您是否知道您是在连接设置期间还是在长时间运行的连接中遇到问题?

我想这是在连接设置期间,但如果requests重用以前打开的连接Connection: keep-alive我可能是错的。

Requests 确实会在可能的情况下重新使用以前打开的连接,这就是我问这个问题的原因。 ;)

如果我们可以在您的情况下获得此问题的数据包捕获,那将非常有用,尽管考虑到它发生在重负载下,这可能会很棘手。

没问题,我会在周末之后看看我能做些什么。 你想让我把它作为一个新问题提交吗?

是的,请。 =)

@Lukasa urllib3 有什么进展吗?

@caizixian我们已经到了,但是我们的 CI 测试有一些问题,因为 Travis CI 有一个相当旧的 PyPy 图像,目前在 PyOpenSSL 上表现不佳。 我会看看这个周末的某个时候我是否可以让它工作。

如果需要,@ Lukasa @shazow urllib3 总是在http://ci.kennethreitz.org 上有一个家!

这个有更新吗? 使用 aws 时经常会发生这种情况。

@mindw据我所知,我们对它发生的确切地点和时间没有很好的了解。 在上面的回溯中,它发生在握手期间,这通常是协商的问题:您什么时候遇到此错误?

OS X,Python 3.5.1,要求 2.10.0 + 安全。
我会尝试提供任何额外的信息upom请求:)

Traceback (most recent call last):
  File "/Users/gabdav01/.virtualenvs/splatt/lib/python3.5/site-packages/requests/packages/urllib3/connectionpool.py", line 578, in urlopen
    chunked=chunked)
  File "/Users/gabdav01/.virtualenvs/splatt/lib/python3.5/site-packages/requests/packages/urllib3/connectionpool.py", line 351, in _make_request
    self._validate_conn(conn)
  File "/Users/gabdav01/.virtualenvs/splatt/lib/python3.5/site-packages/requests/packages/urllib3/connectionpool.py", line 814, in _validate_conn
    conn.connect()
  File "/Users/gabdav01/.virtualenvs/splatt/lib/python3.5/site-packages/requests/packages/urllib3/connection.py", line 289, in connect
    ssl_version=resolved_ssl_version)
  File "/Users/gabdav01/.virtualenvs/splatt/lib/python3.5/site-packages/requests/packages/urllib3/util/ssl_.py", line 308, in ssl_wrap_socket
    return context.wrap_socket(sock, server_hostname=server_hostname)
  File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/ssl.py", line 376, in wrap_socket
    _context=self)
  File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/ssl.py", line 747, in __init__
    self.do_handshake()
  File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/ssl.py", line 983, in do_handshake
    self._sslobj.do_handshake()
  File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/ssl.py", line 628, in do_handshake
    self._sslobj.do_handshake()
ssl.SSLEOFError: EOF occurred in violation of protocol (_ssl.c:645)

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/Users/gabdav01/.virtualenvs/splatt/lib/python3.5/site-packages/requests/adapters.py", line 403, in send
    timeout=timeout
  File "/Users/gabdav01/.virtualenvs/splatt/lib/python3.5/site-packages/requests/packages/urllib3/connectionpool.py", line 604, in urlopen
    raise SSLError(e)
requests.packages.urllib3.exceptions.SSLError: EOF occurred in violation of protocol (_ssl.c:645)

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/Users/gabdav01/.virtualenvs/splatt/bin/splatt", line 9, in <module>
    load_entry_point('splatt', 'console_scripts', 'splatt')()
  File "/Users/gabdav01/.virtualenvs/splatt/lib/python3.5/site-packages/click/core.py", line 716, in __call__
    return self.main(*args, **kwargs)
  File "/Users/gabdav01/.virtualenvs/splatt/lib/python3.5/site-packages/click/core.py", line 696, in main
    rv = self.invoke(ctx)
  File "/Users/gabdav01/.virtualenvs/splatt/lib/python3.5/site-packages/click/core.py", line 1060, in invoke
    return _process_result(sub_ctx.command.invoke(sub_ctx))
  File "/Users/gabdav01/.virtualenvs/splatt/lib/python3.5/site-packages/click/core.py", line 889, in invoke
    return ctx.invoke(self.callback, **ctx.params)
  File "/Users/gabdav01/.virtualenvs/splatt/lib/python3.5/site-packages/click/core.py", line 534, in invoke
    return callback(*args, **kwargs)
  File "/Users/gabdav01/.virtualenvs/splatt/lib/python3.5/site-packages/click/decorators.py", line 17, in new_func
    return f(get_current_context(), *args, **kwargs)
  File "/Users/gabdav01/work/paas/splatt/splatt/cmd.py", line 108, in create
    url, json=json, headers=headers)
  File "/Users/gabdav01/.virtualenvs/splatt/lib/python3.5/site-packages/requests/sessions.py", line 518, in post
    return self.request('POST', url, data=data, json=json, **kwargs)
  File "/Users/gabdav01/.virtualenvs/splatt/lib/python3.5/site-packages/requests/sessions.py", line 475, in request
    resp = self.send(prep, **send_kwargs)
  File "/Users/gabdav01/.virtualenvs/splatt/lib/python3.5/site-packages/requests/sessions.py", line 585, in send
    r = adapter.send(request, **kwargs)
  File "/Users/gabdav01/.virtualenvs/splatt/lib/python3.5/site-packages/requests/adapters.py", line 477, in send
    raise SSLError(e, request=request)
requests.exceptions.SSLError: EOF occurred in violation of protocol (_ssl.c:645)

这强烈表明缺乏 SNI 或没有密码重叠。 你能在 OP 中打印密码命令行并告诉我它说的是什么吗?

我该怎么做?

@mindw看看OP (原帖), @caizixiancryptography导入后端并打印 OpenSSL 版本。

也得到这个问题。 我可以提供哪些信息来帮助解决?

@LukeNZ很多东西。 Python 版本、已安装的软件包、请求版本、OpenSSL 版本、操作系统以及您尝试联系的网站。

嗨,我刚开始使用 Requests,我也遇到了同样的问题。 我在 OS X 10.11.5、Python 3.5.1 上使用虚拟环境,最新版本的请求。 在 OP 中运行 open_ssl 版本给了我

OpenSSL 1.0.2h 2016 年 5 月 3 日

我正在尝试连接到https://api.marketcircle.net/v1/

看起来 Requests 是镇上唯一一款无需编写大量代码的游戏——Unirest 不再安装 Python 3,所以男孩,我希望这能尽快解决。

@eoco好的,这很有趣。 我无法在 OS X 10.11.6 Beta、Python 3.5.1 和 Requests 2.10.0 上重现这个。 您是持续还是间歇性地遇到该问题?

始终如一 - 我还没有能够成功连接。

我的回溯与上面的 Mindw 非常接近,将在此处发布在底部。 但正如仅供参考,我也安装了 Python 2.7 的请求来测试它并确实收到了 SNIMissingWarning:虽然相同的警告说它可能与 Python 的旧版本有关,但我不确定这是否是案件。 无论如何,那里也没有连接运气。

SNIMissingWarning /Library/Python/2.7/site-packages/requests-2.10.0-py2.7.egg/requests/packages/urllib3/util/ssl_.py:122: InsecurePlatformWarning: A true SSLContext object is not available. This prevents urllib3 from configuring SSL appropriately and may cause certain SSL connections to fail. You can upgrade to a newer version of Python to solve this. For more information, see https://urllib3.readthedocs.org/en/latest/security.html#insecureplatformwarning.

我还回去在 Python 2.7 中安装 Unirest 并得到另一个 EOF 错误,但这次是在 urllib2 中:

urllib2.URLError: <urlopen error [Errno 8] _ssl.c:510: EOF occurred in violation of protocol>

所以 - 这真的可能与 Requests.py 根本没有任何关系,但老实说,除了不使用 Python 之外,我不知道从哪里开始。 这是来自 requests/Python 3.5.1 的回溯:
`
进口请求
url = ' https://api.marketcircle.net/v1/ '
r = requests.get(url) # 不添加任何授权头,只检查连接

回溯(最近一次调用最后一次):
文件“/Volumes/Harvey_740/Flask_Daylite_02/myvenv/lib/python3.5/site-packages/requests/packages/urllib3/connectionpool.py”,第578行,在urlopen中
分块=分块)
文件“/Volumes/Harvey_740/Flask_Daylite_02/myvenv/lib/python3.5/site-packages/requests/packages/urllib3/connectionpool.py”,第351行,_make_request
self._validate_conn(conn)
文件“/Volumes/Harvey_740/Flask_Daylite_02/myvenv/lib/python3.5/site-packages/requests/packages/urllib3/connectionpool.py”,第814行,_validate_conn
连接.connect()
文件“/Volumes/Harvey_740/Flask_Daylite_02/myvenv/lib/python3.5/site-packages/requests/packages/urllib3/connection.py”,第289行,连接
ssl_version=resolved_ssl_version)
文件“/Volumes/Harvey_740/Flask_Daylite_02/myvenv/lib/python3.5/site-packages/requests/packages/urllib3/util/ssl_.py”,第308行,ssl_wrap_socket
返回 context.wrap_socket(sock, server_hostname=server_hostname)
文件“/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/ssl.py”,第 376 行,在 wrap_socket
_上下文=自我)
文件“/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/ssl.py”,第 747 行,在 __init__ 中
self.do_handshake()
文件“/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/ssl.py”,第 983 行,在 do_handshake 中
self._sslobj.do_handshake()
文件“/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/ssl.py”,第 628 行,在 do_handshake 中
self._sslobj.do_handshake()
ssl.SSLEOFError: EOF 发生违反协议 (_ssl.c:645)

在处理上述异常的过程中,又发生了一个异常:

回溯(最近一次调用最后一次):
文件“/Volumes/Harvey_740/Flask_Daylite_02/myvenv/lib/python3.5/site-packages/requests/adapters.py”,第403行,发送
超时=超时
文件“/Volumes/Harvey_740/Flask_Daylite_02/myvenv/lib/python3.5/site-packages/requests/packages/urllib3/connectionpool.py”,第 604 行,在 urlopen
引发 SSLError(e)
requests.packages.urllib3.exceptions.SSLError: EOF 发生违反协议 (_ssl.c:645)
`
所以,如果这没有帮助,我很抱歉。 谢谢!

你能运行这个并显示输出吗? python3 -c "import ssl; print(ssl.OPENSSL_VERSION)"

所以这是结果:(与在 OP 中运行的命令不同的版本)

OpenSSL 0.9.8zh 2016 年 1 月 14 日

谢谢!

@eoco好的,很酷。

所以这里的问题是你的 Python 3 链接到系统 OpenSSL,这是古老的。 您的 pip 环境中有什么? 你能帮我跑python3 -m pip freeze吗?

那里没有太多..

Mozaica-iMac:~ eoc$ python3 -m pip freeze

py3minepi==0.0.1
requests==2.10.0
You are using pip version 8.1.1, however version 8.1.2 is available.

感谢您在这方面超越自我。 这显然不是 Requests 的问题,所以我非常感谢您的时间。

好的,解决这个问题的最简单方法是运行python3 -m pip install pyopenssl pyasn1 ndg-httpsclient 。 这应该可以解决您的问题,但如果不能,我们可以采取更积极的选择。

唔。 之后还是同样的错误-

python3.5 -m pip 冻结

cffi==1.6.0
cryptography==1.4
idna==2.1
ndg-httpsclient==0.4.1
py3minepi==0.0.1
pyasn1==0.1.9
pycparser==2.14
pyOpenSSL==16.0.0
requests==2.10.0
six==1.10.0

@eoco嗯。 你能为我运行这个吗? python3 -c "from requests.packages.urllib3.contrib import pyopenssl; pyopenssl.inject_into_urllib3()"并告诉我输出什么? 还运行python3 -c "from cryptography.hazmat.backends.openssl.backend import backend; print(backend.openssl_version_text())"

哇,这确实指出了问题。 第一次运行时,我得到了以下回溯:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages/requests/packages/urllib3/contrib/pyopenssl.py", line 63, in <module>
    from urllib3.packages.backports.makefile import backport_makefile
ImportError: No module named 'urllib3'

urllib 不是标准库的一部分吗? 无论如何,我 pip 安装了 urllib,现在我已经启动并运行了。

我无法告诉你我有多么感谢你在这方面的帮助,你已经超越了。 我想知道 python.org 上 Mac 的 Python 3.5 下载是否有问题? 对于这个项目来说,这几乎是一个全新的安装。 无论如何,如果他们遇到这样的事情,也许这会帮助其他人。

再次,谢谢你!

啊,这看起来像是一个正确的请求错误。 Urllib3 在其代码库中有一个非相对导入,当我们将其供应商化时会中断! 我们应该致力于解决这个问题。

@eoco因此,当我们通过管道运行此修复程序时(请参阅 shazow/urllib3#901),最简单的修复程序是使用 Homebrew 之类的工具安装 Python 3。 这会将您的 Python 3 与更新的 OpenSSL 链接起来,这将为您在请求和使用系统 TLS 绑定的任何其他应用程序中解决此问题。

知道了。 只是安装 urllib3 似乎已经解决了我的问题,但我可能会这样做。 对于由此可能造成的任何混淆,我们深表歉意。

谢谢!

在切换到 aws 并将应用程序置于弹性负载均衡器之后,我遇到了同样的错误,以前从未发生过。

我也安装了 urllib3。

安装pyopenssl有希望吗? 我试过了,但有很多 c 级错误(这可能是我的 docker 映像中缺少某些部分的原因)。

[2016-06-29 02:27:59,932: CRITICAL/MainProcess] Task ventures.tasks.cache_warmup[ae2c97eb-3b28-4896-8d0f-42f712115707] INTERNAL ERROR: SSLError(SSLError(SSLEOFError(8, 'EOF occurred in violation of protocol (_ssl.c:645)'),),)
Traceback (most recent call last):
  File "/usr/local/lib/python3.5/dist-packages/celery/app/trace.py", line 253, in trace_task
    I, R, state, retval = on_error(task_request, exc, uuid)
  File "/usr/local/lib/python3.5/dist-packages/celery/app/trace.py", line 201, in on_error
    R = I.handle_error_state(task, eager=eager)
  File "/usr/local/lib/python3.5/dist-packages/celery/app/trace.py", line 85, in handle_error_state
    }[self.state](task, store_errors=store_errors)
  File "/usr/local/lib/python3.5/dist-packages/celery/app/trace.py", line 125, in handle_failure
    einfo=einfo)
  File "/usr/local/lib/python3.5/dist-packages/celery/utils/dispatch/signal.py", line 166, in send
    response = receiver(signal=self, sender=sender, **named)
  File "/srv/core/celery.py", line 31, in notify_task_failure
    """.format(sender, exception, args, kwargs))
  File "/usr/lib/python3.5/logging/__init__.py", line 1308, in error
    self._log(ERROR, msg, args, **kwargs)
  File "/usr/lib/python3.5/logging/__init__.py", line 1415, in _log
    self.handle(record)
  File "/usr/lib/python3.5/logging/__init__.py", line 1425, in handle
    self.callHandlers(record)
  File "/usr/lib/python3.5/logging/__init__.py", line 1487, in callHandlers
    hdlr.handle(record)
  File "/usr/lib/python3.5/logging/__init__.py", line 855, in handle
    self.emit(record)
  File "/srv/core/management/logger/slack.py", line 28, in emit
    notify_slack(message, channel)
  File "/usr/local/lib/python3.5/dist-packages/celery/local.py", line 188, in __call__
    return self._get_current_object()(*a, **kw)
  File "/usr/local/lib/python3.5/dist-packages/celery/app/trace.py", line 439, in __protected_call__
    return orig(self, *args, **kwargs)
  File "/usr/local/lib/python3.5/dist-packages/celery/app/task.py", line 420, in __call__
    return self.run(*args, **kwargs)
  File "/srv/core/tasks.py", line 66, in notify_slack
    data=json.dumps(payload), headers={'Content-Type': 'application/json'}
  File "/usr/local/lib/python3.5/dist-packages/requests/api.py", line 107, in post
    return request('post', url, data=data, json=json, **kwargs)
  File "/usr/local/lib/python3.5/dist-packages/requests/api.py", line 53, in request
    return session.request(method=method, url=url, **kwargs)
  File "/usr/local/lib/python3.5/dist-packages/requests/sessions.py", line 468, in request
    resp = self.send(prep, **send_kwargs)
  File "/usr/local/lib/python3.5/dist-packages/requests/sessions.py", line 576, in send
    r = adapter.send(request, **kwargs)
  File "/usr/local/lib/python3.5/dist-packages/requests/adapters.py", line 447, in send
    raise SSLError(e, request=request)
requests.exceptions.SSLError: EOF occurred in violation of protocol (_ssl.c:645)
pip freeze:

amqp==1.4.9
analytics-python==1.1.0
anyjson==0.3.3
beautifulsoup4==4.4.1
billiard==3.3.0.23
bleach==1.4.2
boto==2.39.0
celery==3.1.23
Django==1.8.13
django-appconf==1.0.2
django-compressor==2.0
django-countries==3.4.1
django-filter==0.13.0
django-haystack==2.5.dev0
django-htmlmin==0.9.0
django-modelcluster==1.1
django-overextends==0.4.1
django-redis==4.3.0
django-rest-swagger==0.3.5
django-storages-redux==1.3.2
django-taggit==0.18.3
django-treebeard==4.0.1
djangorestframework==3.3.3
docopt==0.4.0
docutils==0.12
drf-extensions==0.2.8
dropbox==4.0
elasticsearch==1.8.0
et-xmlfile==1.0.1
geopy==1.11.0
google-api-python-client==1.5.0
gunicorn==19.4.5
hiredis==0.2.0
html5lib==0.9999999
httplib2==0.9.2
jdcal==1.2
jsonfield==1.0.3
kombu==3.0.35
mandrill==1.0.57
Markdown==2.6.5
mock==1.0.1
numpy==1.11.0
oauth2client==2.2.0
openpyxl==2.3.4
Pillow==3.1.1
psycopg2==2.6.1
pyasn1==0.1.9
pyasn1-modules==0.0.8
pycurl==7.43.0
pygobject==3.20.0
PyMySQL==0.7.2
python-apt==1.1.0b1
python-dateutil==2.5.3
pytz==2016.4
PyYAML==3.11
rcssmin==1.0.6
redis==2.10.5
requests==2.9.1
rjsmin==1.0.12
rsa==3.4.2
simplejson==3.8.2
six==1.10.0
sphinx-me==0.3
unattended-upgrades==0.1
Unidecode==0.4.19
uritemplate==0.6
urllib3==1.16
wagtail==1.4.5
Willow==0.3.1
python3 -c "from requests.packages.urllib3.contrib import pyopenssl; pyopenssl.inject_into_urllib3()"
Traceback (most recent call last):
  File "<string>", line 1, in <module>
  File "/usr/local/lib/python3.5/dist-packages/requests/packages/urllib3/contrib/pyopenssl.py", line 49, in <module>
    from ndg.httpsclient.ssl_peer_verification import SUBJ_ALT_NAME_SUPPORT
ImportError: No module named 'ndg'

@shredding尝试安装 pyopenssl、ndg-httpsclient 和 pyasn1。 这个时候你需要这三个。

好的,我会试一试(我只能在 aws 上重现它并报告)。

对于那些在 docker 上的ubuntu:latest包中运行 python3 的人,您需要添加

RUN apt-get install build-essentials python-dev libffi

添加前

pyOpenSSL==16.0.0
ndg-httpsclient==0.4.1
pyasn1==0.1.9

...根据您的要求.txt

在这里遇到了同样的问题。
通过安装 pyopenssl、ndg-httpsclient、pyasn1 和 urllib3 ofcourse 修复。

我也不会再出现在我身边。

我试图连接到 twitter API,所以起初我收到以下错误
requests.exceptions.SSLError: EOF occurred in violation of protocol (_ssl.c:645)

我使用了猴子补丁,但是信钱补丁没有用,我安装了pyOpenSSL 、ndg-httpsclient、pyasn1并且以某种方式起作用了。
但在这之后我得到了这个
Traceback (most recent call last): File "twitter_friend.py", line 32, in <module> stream.statuses.filter(follow='sajjkum') File "C:\Python27\lib\site-packages\twython\streaming\types.py", line 66, in filter self.streamer._request(url, 'POST', params=params) File "C:\Python27\lib\site-packages\twython\streaming\api.py", line 139, in _request response = _send(retry_counter) File "C:\Python27\lib\site-packages\twython\streaming\api.py", line 123, in _send response = func(url, **requests_args) File "C:\Python27\lib\site-packages\requests\sessions.py", line 511, in post return self.request('POST', url, data=data, json=json, **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 426, in send raise ConnectionError(err, request=request) requests.exceptions.ConnectionError: ('Connection aborted.', BadStatusLine("''",))

和这个
Traceback (most recent call last): File "twitter_friend.py", line 32, in <module> stream.statuses.filter(follow='sajjkum') File "C:\Python27\lib\site-packages\twython\streaming\types.py", line 66, in filter self.streamer._request(url, 'POST', params=params) File "C:\Python27\lib\site-packages\twython\streaming\api.py", line 139, in _request response = _send(retry_counter) File "C:\Python27\lib\site-packages\twython\streaming\api.py", line 123, in _send response = func(url, **requests_args) File "C:\Python27\lib\site-packages\requests\sessions.py", line 511, in post return self.request('POST', url, data=data, json=json, **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 447, in send raise SSLError(e, request=request) requests.exceptions.SSLError: bad handshake: SysCallError(-1, 'Unexpected EOF')

我正在使用 python 2.7、urllib3(1.4)、requests(2.9.1)。

这两个错误都表明远程服务器不接受您的请求。 但是,我们实际上不可能诊断该错误。 我建议您升级 OpenSSL 并重试。

pip install --force-reinstall requests[security]为我解决了这个问题。

在尝试了上面提到的每个解决方案后,我都遇到了同样的异常。 错误跟踪:
文件“/home/prateek/.local/lib/python2.7/site-packages/requests/sessions.py”,第 488 行,请求
resp = self.send(prep, *send_kwargs)文件“/home/prateek/.local/lib/python2.7/site-packages/requests/sessions.py”,第609行,发送r = adapter.send(request, * kwargs)
文件“/home/prateek/.local/lib/python2.7/site-packages/requests/adapters.py”,第497行,发送
引发 SSLError(e, request=request)
requests.exceptions.SSLError: ("握手错误:SysCallError(-1, 'Unexpected EOF')",)

系统包信息:
cffi==1.9.1
密码学==1.6
idna==2.1
ndg-httpsclient==0.4.2
包资源== 0.0.0
pyasn1==0.1.9
pycparser==2.17
pyOpenSSL == 16.2.0
请求==2.12.3
六==1.10.0

Python:Python 3.5.2(默认,2016 年 7 月 5 日,12:43:10)
操作系统:Ubuntu 16.04
OpenSSL 1.0.2g 2016 年 3 月 1 日

感谢您在这件事上的帮助。

这几乎肯定意味着提供给远程对等方的密码是不可接受的。 如果您使用openssl s_client -connect <host>:<port>访问您要联系的网站,您能告诉我输出是什么吗? (请确保使用您正在使用的 OpenSSL 1.0.2g 这样做)。

@Lukasa感谢您的快速回复。 你问的输出如下:

我还添加了来自 OpenSSL 1.0.1f 2014 年 1 月 6 日的响应
它似乎正在处理这个版本。

@> openssl version
OpenSSL 1.0.2g  1 Mar 2016
@> openssl s_client -connect <host>:<port>
CONNECTED(00000003)
140401805448856:error:140790E5:SSL routines:ssl23_write:ssl handshake failure:s23_lib.c:177:
no peer certificate available
No client certificate CA names sent
SSL handshake has read 0 bytes and written 305 bytes
New, (NONE), Cipher is (NONE)
Secure Renegotiation IS NOT supported
Compression: NONE
Expansion: NONE
No ALPN negotiated
SSL-Session:
    Protocol  : TLSv1.2
    Cipher    : 0000
    Session-ID: 
    Session-ID-ctx: 
    Master-Key: 
    Key-Arg   : None
    PSK identity: None
    PSK identity hint: None
    SRP username: None
    Start Time: 1480703355
    Timeout   : 300 (sec)

我也尝试过使用较早版本的 openssl,它似乎工作正常:

@> openssl version
OpenSSL 1.0.1f 6 Jan 2014
@> openssl s_client -connect <server>:<host>
CONNECTED(00000003)
depth=0 C = US, ST = California, O = Internet Widgits Pty Ltd
verify error:num=20:unable to get local issuer certificate
verify return:1
depth=0 C = US, ST = California, O = Internet Widgits Pty Ltd
verify error:num=27:certificate not trusted
verify return:1
depth=0 C = US, ST = California, O = Internet Widgits Pty Ltd
verify error:num=21:unable to verify the first certificate
verify return:1
Certificate chain
 0 s:/C=US/ST=California/O=Internet Widgits Pty Ltd
   i:/C=US/ST=California/O=Internet Widgits Pty Ltd/CN=John Smith
Server certificate
BEGIN CERTIFICATE
<certificate>
END CERTIFICATE
subject=/C=US/ST=California/O=Internet Widgits Pty Ltd
issuer=/C=US/ST=California/O=Internet Widgits Pty Ltd/CN=<Name>

No client certificate CA names sent
SSL handshake has read 2120 bytes and written 477 bytes

New, TLSv1/SSLv3, Cipher is ECDHE-RSA-AES256-SHA384
Server public key is 4096 bit
Secure Renegotiation IS supported
Compression: NONE
Expansion: NONE
SSL-Session:
    Protocol  : TLSv1.2
    Cipher    : ECDHE-RSA-AES256-SHA384
    Session-ID: C7AEA448B9E21C30D90D1377904426A9D1A21971785D547378CA07ACDAC00161
    Session-ID-ctx: 
    Master-Key: C5B31E9D7A59EF4E6A2657E9F55A64B89F4AE3BBDFD864ADD1087449AA927D9C1655A76E44C3E30FF2301DB00C1CB2F7
    Key-Arg   : None
    PSK identity: None
    PSK identity hint: None
    SRP username: None
    Start Time: 1480703425
    Timeout   : 300 (sec)
    Verify return code: 21 (unable to verify the first certificate)

所以这看起来你的服务器对你的 OpenSSL 1.0.2 握手中的某些东西有非常强烈的反对。 你熟悉tcpdump或wireshark吗? 如果是的话,如果您可以捕获两次握手的数据包并将它们提供给我,那将非常有帮助。

www.celestrak.com有同样的问题

pip freeze --local

[...] Omitting other packages
cffi==1.9.1
cryptography==1.7.1
idna==2.2
ipaddress==1.0.17
ndg-httpsclient==0.4.2
numpy==1.11.3
pyasn1==0.1.9
pyOpenSSL==16.2.0
requests==2.12.4
scandir==1.4

openssl s_client -connect www.celestrak.com:443

CONNECTED(00000003)
140736264172552:error:140790E5:SSL routines:ssl23_write:ssl handshake failure:s23_lib.c:177:
---
no peer certificate available
---
No client certificate CA names sent
---
SSL handshake has read 0 bytes and written 308 bytes
---
New, (NONE), Cipher is (NONE)
Secure Renegotiation IS NOT supported
Compression: NONE
Expansion: NONE
No ALPN negotiated
SSL-Session:
    Protocol  : TLSv1.2
    Cipher    : 0000
    Session-ID:
    Session-ID-ctx:
    Master-Key:
    Key-Arg   : None
    PSK identity: None
    PSK identity hint: None
    SRP username: None
    Start Time: 1483987800
    Timeout   : 300 (sec)
    Verify return code: 0 (ok)
---

openssl version

OpenSSL 1.0.2j  26 Sep 2016

我正在使用此处建议的修复程序(之前有效)。

class CustomAdapter(requests.adapters.HTTPAdapter):
    ''' See: http://stackoverflow.com/a/14146031/1334711 '''
    def init_poolmanager(self, connections, maxsize, block=False):
        self.poolmanager = requests.packages.urllib3.poolmanager.PoolManager(
            num_pools=connections,
            maxsize=maxsize,
            block=block,
            ssl_version=ssl.PROTOCOL_TLSv1)

# Other code

        if url_parse.scheme in ('http', 'https'):
            # It's a URL, get from Internet
            try:
                tle_file = requests.get(source).text

            except requests.exceptions.SSLError:
                pytest.set_trace()
                s = requests.Session()
                s.mount('https://', CustomAdapter())
                tle_file = s.get(source).text

Python v.2.7.13
操作系统:macOS 10.12.2

我得到的错误是:
SSLError: ("bad handshake: SysCallError(-1, 'Unexpected EOF')",)

@rubendibattista www.celestrack.com有一个糟糕的TLS 配置,你可以在这里看到。 这意味着现代版本的 Requests 不支持服务器支持的任何密码套件,因为它们都很弱且已损坏。

首先,我建议根本不要联系该服务器。 如果这是不可能的,你可以通过做一些修改默认密码套件这样

@Lukasa感谢您的支持。 我联系了该站点的管理员以报告您所说的内容并尝试找到比使用您建议的解决方法更好的解决方案。

嗨,大家好! 也有这个错误。 使用 python3 并安装组合(pyopenssl ndg-httpsclient pyasn1 urllib3)可以解决问题。 但我很好奇 python2.7 在 OS X 和 Ubuntu 上的表现:

场景001

  • 蟒蛇:2.7
  • 请求:2.3.0
  • pyopenssl ndg-httpsclient pyasn1 urllib3:未安装
  • 虚拟环境:1.11.6
  • 操作系统:OS X El 船长 10.11.6 (15G1217)
  • OpenSSL:0.9.8zh 2016 年 1 月 14 日

错误

Traceback (most recent call last):
  File "loanpro_doc_uploader.py", line 113, in <module>
    run()
  File "loanpro_doc_uploader.py", line 109, in run
    loanpro = LoanPro(args.env, args.folder)
  File "loanpro_doc_uploader.py", line 36, in __init__
    self.get_all_customforms_data()
  File "loanpro_doc_uploader.py", line 69, in get_all_customforms_data
    resp = requests.get(url, headers=headers)
  File "/Users/vyscond/Projects/razorvision/loan-documents/env/lib/python2.7/site-packages/requests/api.py", line 55, in get
    return request('get', url, **kwargs)
  File "/Users/vyscond/Projects/razorvision/loan-documents/env/lib/python2.7/site-packages/requests/api.py", line 44, in request
    return session.request(method=method, url=url, **kwargs)
  File "/Users/vyscond/Projects/razorvision/loan-documents/env/lib/python2.7/site-packages/requests/sessions.py", line 456, in request
    resp = self.send(prep, **send_kwargs)
  File "/Users/vyscond/Projects/razorvision/loan-documents/env/lib/python2.7/site-packages/requests/sessions.py", line 559, in send
    r = adapter.send(request, **kwargs)
  File "/Users/vyscond/Projects/razorvision/loan-documents/env/lib/python2.7/site-packages/requests/adapters.py", line 382, in send
    raise SSLError(e, request=request)
requests.exceptions.SSLError: EOF occurred in violation of protocol (_ssl.c:590)

场景002

  • 蟒蛇:3.4
  • 请求:2.12.5
  • pyopenssl ndg-httpsclient pyasn1 urllib3:未安装
  • 虚拟环境:1.11.6
  • 操作系统:OS X El 船长 10.11.6 (15G1217)
  • OpenSSL:0.9.8zh 2016 年 1 月 14 日

错误

Traceback (most recent call last):
  File "/Users/vyscond/Projects/razorvision/loan-documents/env3/lib/python3.4/site-packages/requests/packages/urllib3/connectionpool.py", line 594, in urlopen
    chunked=chunked)
  File "/Users/vyscond/Projects/razorvision/loan-documents/env3/lib/python3.4/site-packages/requests/packages/urllib3/connectionpool.py", line 350, in _make_request
    self._validate_conn(conn)
  File "/Users/vyscond/Projects/razorvision/loan-documents/env3/lib/python3.4/site-packages/requests/packages/urllib3/connectionpool.py", line 835, in _validate_conn
    conn.connect()
  File "/Users/vyscond/Projects/razorvision/loan-documents/env3/lib/python3.4/site-packages/requests/packages/urllib3/connection.py", line 323, in connect
    ssl_context=context)
  File "/Users/vyscond/Projects/razorvision/loan-documents/env3/lib/python3.4/site-packages/requests/packages/urllib3/util/ssl_.py", line 324, in ssl_wrap_socket
    return context.wrap_socket(sock, server_hostname=server_hostname)
  File "/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/ssl.py", line 365, in wrap_socket
    _context=self)
  File "/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/ssl.py", line 583, in __init__
    self.do_handshake()
  File "/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/ssl.py", line 810, in do_handshake
    self._sslobj.do_handshake()
ssl.SSLEOFError: EOF occurred in violation of protocol (_ssl.c:600)

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/Users/vyscond/Projects/razorvision/loan-documents/env3/lib/python3.4/site-packages/requests/adapters.py", line 423, in send
    timeout=timeout
  File "/Users/vyscond/Projects/razorvision/loan-documents/env3/lib/python3.4/site-packages/requests/packages/urllib3/connectionpool.py", line 624, in urlopen
    raise SSLError(e)
requests.packages.urllib3.exceptions.SSLError: EOF occurred in violation of protocol (_ssl.c:600)

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "loanpro_doc_uploader.py", line 113, in <module>
    run()
  File "loanpro_doc_uploader.py", line 109, in run
    loanpro = LoanPro(args.env, args.folder)
  File "loanpro_doc_uploader.py", line 36, in __init__
    self.get_all_customforms_data()
  File "loanpro_doc_uploader.py", line 69, in get_all_customforms_data
    resp = requests.get(url, headers=headers)
  File "/Users/vyscond/Projects/razorvision/loan-documents/env3/lib/python3.4/site-packages/requests/api.py", line 70, in get
    return request('get', url, params=params, **kwargs)
  File "/Users/vyscond/Projects/razorvision/loan-documents/env3/lib/python3.4/site-packages/requests/api.py", line 56, in request
    return session.request(method=method, url=url, **kwargs)
  File "/Users/vyscond/Projects/razorvision/loan-documents/env3/lib/python3.4/site-packages/requests/sessions.py", line 488, in request
    resp = self.send(prep, **send_kwargs)
  File "/Users/vyscond/Projects/razorvision/loan-documents/env3/lib/python3.4/site-packages/requests/sessions.py", line 609, in send
    r = adapter.send(request, **kwargs)
  File "/Users/vyscond/Projects/razorvision/loan-documents/env3/lib/python3.4/site-packages/requests/adapters.py", line 497, in send
    raise SSLError(e, request=request)
requests.exceptions.SSLError: EOF occurred in violation of protocol (_ssl.c:600)

场景004

  • 蟒蛇:2.7
  • 请求:2.12.5
  • pyopenssl ndg-httpsclient pyasn1 urllib3:未安装
  • 操作系统:Ubuntu 14.4(Docker 化)
  • OpenSSL:未安装

错误消失了

场景003

  • 蟒蛇:3.4
  • 请求:2.12.5
  • pyopenssl ndg-httpsclient pyasn1 urllib3:已安装
  • 虚拟环境:1.11.6
  • 操作系统:OS X El 船长 10.11.6 (15G1217)
  • OpenSSL:0.9.8zh 2016 年 1 月 14 日

错误消失了

该错误尚不清楚,但很可能是您的 OpenSSL 版本造成的。 如果您发出 HTTPS 请求,那么您声称 Ubuntu 14.04 没有 OpenSSL 的说法根本成立。 我最好的猜测是服务器正在发送 EOF,因为您的密码都不可接受。 Ubuntu 之所以有效,是因为它有一个更新的 OpenSSL 和更新的密码。 安装 PyOpenSSL 之所以有效,是因为它提供了 OpenSSL 1.0.2 的供应商副本,也带有更新的密码。

你好!

我有一些 https 站点和请求库的问题。
网站: https :

安装:
appdirs==1.4.0
cffi==1.9.1
密码学==1.7.2
idna==2.2
ndg-httpsclient==0.4.2
包装==16.8
pyasn1==0.1.9
pycparser==2.17
pyOpenSSL == 16.2.0
pyparsing==2.1.10
请求==2.13.0
六==1.10.0
urllib3==1.20
OpenSSL 1.0.2k 2017 年 1 月 26 日

得到一个错误:requests.exceptions.SSLError: ("bad handshake: SysCallError(-1, 'Unexpected EOF')",)

操作系统:Archbang linux,最新
Python 3.6 和 Python 2.7 - 同样的错误

您是另一个在我们的竞争中获胜的人,谁能尝试联系世界上最糟糕的 HTTPS 服务器。 该服务器配置非常糟糕,完全不安全。 您遇到此问题的原因是 Requests 不再支持该服务器支持的任何密码套件,因为它们要么很弱要么不安全。 首先,我建议您尝试向某人施压以修复服务器,但如果您确实必须联系它,您可以像这样重新添加 3DES。

@vyscond救了我的命。 别介意我在 OSX 上做了什么,只有在安装pyopenssl ndg-httpsclient pyasn1 urllib3时它才会消失。 也许它应该添加为requests OSX 安装的依赖项?

它仅在 OS X 和 Python 的某些配置上有用。 最终结果是它们仍然是可选的。

我想知道人们在(也许)找到该问题的解决方案之前花费了多少时间。 我不得不通过很多来找到这个线程并通过它。 这值得么?

要看。 也可以通过要求这些依赖项来引入问题,尤其是它向您的系统添加了一个新的 OpenSSL,该系统单独进行版本控制和管理。

@Lukasa出于某些原因,我的设置
我不得不卸载 pyopenssl 包以强制请求在 urllib3 中使用 OpenSSL。
使用 adal (https://github.com/AzureAD/azure-activedirectory-library-for-python) 时会发生这种情况,它基本上不适用于某些旧版本的请求(支持证书的请求)。
不过,对我来说似乎有点巫术。

我在 Mac OSX Sierra v 10.12.0 上遇到了这个问题。 在这个线程上尝试了所有方法,没有奏效。 最后将我的操作系统升级到 v10.12.6,问题就消失了。

当使用 python 请求对位于 vpn 后面的站点进行 api 调用时,该错误也可能会表现出来,而该 vpn 隧道恰好在那时关闭。

嗨,大家好!

我对自己的请求有点陌生,在对请求进行 POC 以查看它是否能满足我对通用标准合规性的要求时发现了这个错误。 我试图将我的请求 POC 连接到这个工具,我专门查看 FIA-X509 Ext 1.1 的测试用例,但这就是我得到的:

回溯(最近一次调用最后一次):
文件“/home/hussain/Desktop/pythonVenv/python36Venv/lib/python3.6/site-packages/urllib3/connectionpool.py”,第 601 行,在 urlopen
分块=分块)
_make_request 中的文件“/home/hussain/Desktop/pythonVenv/python36Venv/lib/python3.6/site-packages/urllib3/connectionpool.py”,第 346 行
self._validate_conn(conn)
文件“/home/hussain/Desktop/pythonVenv/python36Venv/lib/python3.6/site-packages/urllib3/connectionpool.py”,第850行,_validate_conn
连接.connect()
文件“/home/hussain/Desktop/pythonVenv/python36Venv/lib/python3.6/site-packages/urllib3/connection.py”,第326行,连接
ssl_context=上下文)
文件“/home/hussain/Desktop/pythonVenv/python36Venv/lib/python3.6/site-packages/urllib3/util/ssl_.py”,第 329 行,在 ssl_wrap_socket
返回 context.wrap_socket(sock, server_hostname=server_hostname)
文件“/usr/lib/python3.6/ssl.py”,第 407 行,在 wrap_socket
_context=self,_session=session)
文件“/usr/lib/python3.6/ssl.py”,第 814 行,在 __init__ 中
self.do_handshake()
文件“/usr/lib/python3.6/ssl.py”,第 1068 行,在 do_handshake 中
self._sslobj.do_handshake()
文件“/usr/lib/python3.6/ssl.py”,第 689 行,在 do_handshake 中
self._sslobj.do_handshake()
ssl.SSLEOFError: EOF 发生违反协议 (_ssl.c:777)

在处理上述异常的过程中,又发生了一个异常:

回溯(最近一次调用最后一次):
文件“/home/hussain/Desktop/pythonVenv/python36Venv/lib/python3.6/site-packages/requests/adapters.py”,第440行,发送
超时=超时
文件“/home/hussain/Desktop/pythonVenv/python36Venv/lib/python3.6/site-packages/urllib3/connectionpool.py”,第 639 行,在 urlopen 中
_stacktrace=sys.exc_info()[2])
文件“/home/hussain/Desktop/pythonVenv/python36Venv/lib/python3.6/site-packages/urllib3/util/retry.py”,第388行,增量
引发 MaxRetryError(_pool, url, error 或 ResponseError(cause))
urllib3.exceptions.MaxRetryError: HTTPSConnectionPool(host='10.0.0.221', port=443): Max retries exceeded with url: / (Caused by SSLError(SSLEOFError(8, 'EOF发生违反协议(_ssl.c:777) )'),))

在处理上述异常的过程中,又发生了一个异常:

回溯(最近一次调用最后一次):
文件“req.py”,第 91 行,在
r = session.request('GET', 'https://10.0.0.221', verify=True)
文件“/home/hussain/Desktop/pythonVenv/python36Venv/lib/python3.6/site-packages/requests/sessions.py”,第508行,请求
resp = self.send(prep, *send_kwargs)文件“/home/hussain/Desktop/pythonVenv/python36Venv/lib/python3.6/site-packages/requests/sessions.py”,第618行,发送r = adapter.send(request, * kwargs)
文件“/home/hussain/Desktop/pythonVenv/python36Venv/lib/python3.6/site-packages/requests/adapters.py”,第506行,发送
引发 SSLError(e, request=request)
requests.exceptions.SSLError: HTTPSConnectionPool(host='10.0.0.221', port=443): Max retries exceeded with url: / (Caused by SSLError(SSLEOFError(8, 'EOF发生违反协议(_ssl.c:777) )'),))

这是我正在使用的 POC 代码:

import ssl
import requests

from requests.adapters import HTTPAdapter
from requests.packages.urllib3.poolmanager import PoolManager
from requests.packages.urllib3.util import ssl_

CIPHERS = (
    'RSA+AES'
)

class TlsAdapter(HTTPAdapter):
    def __init__(self, ssl_options=0, **kwargs):
        self.ssl_options = ssl_options
        super(TlsAdapter, self).__init__(**kwargs)

    def init_poolmanager(self, *pool_args, **pool_kwargs):
        ctx = ssl_.create_urllib3_context(ciphers=CIPHERS, cert_reqs=ssl.CERT_REQUIRED, options=self.ssl_options)

        self.poolmanager = PoolManager(*pool_args,
                                       ssl_context=ctx,
                                       **pool_kwargs)

session = requests.session()

adapter = TlsAdapter(ssl.OP_NO_TLSv1 | ssl.OP_NO_TLSv1_1)
session.mount("https://", adapter)
r = session.request('GET', 'https://10.0.0.221', verify=True)
print(r)

其中 10.0.0.221 是我放置验证工具的地方。

我不确定为什么会发生此错误。 我尝试通过此线程以及有关 stackoverflow 的多个其他问题,但找不到合适的解决方案。

我承认,此时我对 TLS 协议也没有清楚的了解。 因此,如果有人可以指导我了解这里的问题,我将不胜感激。

如果我遗漏了什么或需要提供任何类型的附加信息,请告诉我。 谢谢!

仅供参考,当您连接的服务器上未启用 SSL 时,也会发生此错误。

此页面是否有帮助?
0 / 5 - 0 等级

相关问题

ReimarBauer picture ReimarBauer  ·  4评论

JimHokanson picture JimHokanson  ·  3评论

avinassh picture avinassh  ·  4评论

8key picture 8key  ·  3评论

remram44 picture remram44  ·  4评论