Python Requests Requests.exceptions.SSLError:[Errno 8]\u ssl.c:504:EOF违反了协议

Python Requests Requests.exceptions.SSLError:[Errno 8]\u ssl.c:504:EOF违反了协议,python,openssl,httprequest,python-requests,ubuntu-12.10,Python,Openssl,Httprequest,Python Requests,Ubuntu 12.10,我在Ubuntu 12.10上使用OpenSSL 1.0.1c、Python2.7.3、1.0.3和1.0.4(两者都试过了),并且在尝试连接url变量中的网站时使用以下代码 def SendInitialRequest(xmlmessage, redirecturl): url = 'https://centineltest.cardinalcommerce.com/maps/txns.asp' payload = 'cmpi_msg=' + ET.tostring(xmlm

我在Ubuntu 12.10上使用OpenSSL 1.0.1c、Python2.7.3、1.0.3和1.0.4(两者都试过了),并且在尝试连接url变量中的网站时使用以下代码

def SendInitialRequest(xmlmessage, redirecturl):
    url = 'https://centineltest.cardinalcommerce.com/maps/txns.asp'

    payload = 'cmpi_msg=' + ET.tostring(xmlmessage)
    headers = {
        'Content-Type': 'application/x-www-form-urlencoded',
    }
    r = requests.post(url, data=payload, headers=headers, verify=None)
    print r.text
它抛出以下错误:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "clams/libs/centinel/thinclient.py", line 134, in SendInitialRequest
    r = requests.post(url, data=payload, headers=headers, verify=None)
  File "/home/jasonamyers/.virtualenv/clams/lib/python2.7/site-packages/requests/api.py", line 87, in post
    return request('post', url, data=data, **kwargs)
  File "/home/jasonamyers/.virtualenv/clams/lib/python2.7/site-packages/requests/api.py", line 44, in request
    return session.request(method=method, url=url, **kwargs)
  File "/home/jasonamyers/.virtualenv/clams/lib/python2.7/site-packages/requests/sessions.py", line 269, in request
    resp = self.send(prep, stream=stream, timeout=timeout, verify=verify, cert=cert, proxies=proxies)
  File "/home/jasonamyers/.virtualenv/clams/lib/python2.7/site-packages/requests/sessions.py", line 364, in send
    r = adapter.send(request, **kwargs)
  File "/home/jasonamyers/.virtualenv/clams/lib/python2.7/site-packages/requests/adapters.py", line 163, in send
    raise SSLError(e)
requests.exceptions.SSLError: [Errno 8] _ssl.c:504: EOF occurred in violation of protocol
如果我强制它使用tls1,它就会工作(输出被截断):


我见过很多这样的人;但是,我还没有找到使用python请求库绕过它的方法。非常感谢您的帮助。

这是一个已知的错误,您可以通过黑客解决:

打开
site packages/requests/packages/urllib3/connectionpool.py
(或者在您自己的项目中创建请求的本地副本),并更改显示以下内容的块:

def connect(self):
    # Add certificate verification
    sock = socket.create_connection((self.host, self.port), self.timeout)

    # Wrap socket using verification with the root certs in
    # trusted_root_certs
    self.sock = ssl_wrap_socket(sock, self.key_file, self.cert_file,
                                cert_reqs=self.cert_reqs,
                                ca_certs=self.ca_certs,
                                server_hostname=self.host,
                                ssl_version=self.ssl_version)
致:

否则,我想有一个覆盖的地方,这是少黑客,但我找不到一个与几眼


注意:在旁注中,MacOS上来自PIP(1.0.4)的
请求仅适用于您提供的URL。

在此处为其他人重新发布此请求,来自:

“请求”不支持在版本1之前执行此操作。在版本1之后,您需要对HTTPAdapter进行子类化,如下所示:

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)
完成后,您可以执行以下操作:

import requests
s = requests.Session()
s.mount('https://', MyAdapter())

通过该会话对象的任何请求都将使用TLSv1。

不幸的是,接受的答案对我不起作用。连接到安全网站时,您还可以使用
verify=False
作为临时解决方法

我也有同样的问题:

升起SSLError(e)
requests.exceptions.SSLError:[Errno 8]\u ssl.c:504:EOF违反了协议


我让fiddler运行,我停止了fiddler捕获,并没有看到这个错误。可能是因为fiddler。

我遇到了这个错误,修复程序似乎正在关闭SNI,Python 2.7不支持:


设置verify=False仅跳过验证服务器证书,但无助于解决SSL协议错误

此问题可能是由于在web服务器上禁用了SSLv2,但Python2.x在默认情况下尝试与协议_SSLv23建立连接。这种情况发生在

您可以通过覆盖ssl\u version关键字参数,在ssl模块中对ssl.wrap\u socket()进行修补。以下代码可以按原样使用。在提出任何请求之前,请将此信息放在程序的开头

import ssl
from functools import wraps
def sslwrap(func):
    @wraps(func)
    def bar(*args, **kw):
        kw['ssl_version'] = ssl.PROTOCOL_TLSv1
        return func(*args, **kw)
    return bar

ssl.wrap_socket = sslwrap(ssl.wrap_socket)
请求安装额外的“安全”软件包已为我解决:

sudo apt-get install libffi-dev
sudo pip install -U requests[security]

我在通过TLS连接到RabbitMQ MQTT服务器时出现此错误。我很确定服务器坏了,但不管怎样,它使用的是OpenSSL 1.0.1,而不是OpenSSL 1.0.2

您可以使用以下方法在Python中检查您的版本:

import ssl
ssl.OPENSSL_VERSION

除了使用较旧版本的Python之外,我不知道如何降级Python中的OpenSSL(至少在Windows上它似乎是静态链接的)。

对于无法使用上述修复程序的人

必须更改文件ssl.py来修复它。 查找函数创建默认上下文并更改行:

context = SSLContext(PROTOCOL_SSLv23)


也许有人可以在不编辑ssl.py的情况下创建更简单的解决方案?

我也遇到了类似的问题,我认为如果我们简单地忽略
ssl
验证,它将像魅力一样为我工作。因此,使用
https
方案连接到服务器,但指示他们不要验证证书

使用
请求
。只需提及
verify=False
而不是
None

    requests.post(url, data=payload, headers=headers, verify=False)

希望这对需要的人有用:)。

您是通过软件包管理器安装openssl的吗?如果是,是否检查更新?我可以使用请求连接到此站点。我确实通过软件包管理器安装了openssl,没有更新。你能分享你正在使用的所有东西的版本吗?另外,您是使用内置python还是使用pythonbrews等构建自己的?在我的例子中,答案是:我在尝试使用HTTPS连接到HTTP端点时出错。我只是更改了url,它工作得很好。我还让它在MacOS上工作得很好,只是担心生产,而且当苹果更新OpenSSL时,情况可能并不总是这样。非常感谢您的回复。我想看看我是否真的可以得到一个像这样的定制包推到heroku:)@Jasonameyers:好吧,你可以把它作为你项目的一部分,只需将
requests
文件夹复制到您自己的项目中,
import requests
将更喜欢您的补丁版本,而不是库存版本。确实要避免为多个其他连接中的一个连接执行此操作:(我会继续挖掘,感谢您的回复。我又深入研究了一下,如果不修改模块本身,就无法从
请求
模块的顶部覆盖
ssl_版本
。(您引用的代码是
connection.py
而不是
connectionpool.py
,至少在我的请求版本中是这样的。)(2.5.3).为了让这个答案保持最新,我最终写了这个。自从这个答案发布后,子类API发生了一些变化,所以你应该使用那个博客帖子中的代码,而不是这个答案中的代码。=)@Lukasa的链接似乎处于脱机状态,下面是一个设置
verify=False
的坏主意。您需要找出真正的问题并修复它。非常感谢您提供此修补程序-在使用请求库时,我一直在想方设法设置
ssl\u版本
)很有魅力!!但是这个更改的范围是什么?只有我的程序被设置为使用TLS_1还是全局的?只要代码已经在任何Python调用中运行过,更改就会有效。如果您运行另一个不调用此代码的Python脚本/程序,那么就没有更改。您可以将代码放入它自己的模块中(.py文件)并将此文件导入任何需要此重写的脚本中。@MA1,请提供有关您所面临问题的详细信息。@chnrx pyth
sudo apt-get install libffi-dev
sudo pip install -U requests[security]
import ssl
ssl.OPENSSL_VERSION
context = SSLContext(PROTOCOL_SSLv23)
context = SSLContext(PROTOCOL_TLSv1)
    requests.post(url, data=payload, headers=headers, verify=False)