蟒请求requests.exceptions.SSLError:[错误8] _ssl.c:504:E

2019-07-17 17:28发布

我在Ubuntu 12.10使用OpenSSL 1.0.1c,蟒蛇2.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

尝试使用OpenSSL连接返回以下内容:

$ openssl s_client -connect centineltest.cardinalcommerce.com:443
CONNECTED(00000003)
140019346777760: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 226 bytes
---
New, (NONE), Cipher is (NONE)
Secure Renegotiation IS NOT supported
Compression: NONE
Expansion: NONE
---

如果我强迫它使用TLS1它的工作原理(输出被截断):

$ openssl s_client -tls1 -connect centineltest.cardinalcommerce.com:443
CONNECTED(00000003)
depth=2 C = US, O = "thawte, Inc.", OU = Certification Services Division, OU
verify error:num=20:unable to get local issuer certificate
verify return:0
---

我见过无数的错误报告此; 但是,我还没有找到一种方法,使用Python请求库绕过它。 任何援助将不胜感激。

Answer 1:

在这里重新发布此对他人的要求问题页面 :

要求不支持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。



Answer 2:

设置验证=只假跳过验证服务器证书,但不会有助于解决SSL协议错误。

这个问题可能的SSLv2在Web服务器上被禁用因,但是Python 2.x的尝试建立在默认情况下PROTOCOL_SSLv23的连接。 这发生在https://github.com/python/cpython/blob/360aa60b2a36f5f6e9e20325efd8d472f7559b1e/Lib/ssl.py#L1057

您可以通过重写SSL_VERSION关键字参数的SSL模块中的猴子补丁ssl.wrap_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)


Answer 3:

安装了“安全”包额外requests解决了我:

命令和apt-get安装libffi-dev的

须藤PIP安装-U请求[安全]



Answer 4:

这是一个已知的bug,你可以用破解工作,它周围:

打开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)

至:

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=ssl.PROTOCOL_TLSv1)

否则,我想有一个覆盖的地方是少哈克,但我无法找到一个有几几眼。

:在旁注, requests从PIP(1.0.4)上的MacOS只是作品与您提供的网址。



Answer 5:

我遇到了这个错误,并修复似乎关闭SNI,它是由Python 2.7不支持:

http://bugs.python.org/issue5639

urllib3对谷歌应用程序引擎的Python 2.7 SNI错误



Answer 6:

人不能得到上述工作的修复。

不得不改变文件ssl.py修复它。 寻找功能create_default_context和变更线:

context = SSLContext(PROTOCOL_SSLv23)

context = SSLContext(PROTOCOL_TLSv1)

也许有人可以创建一个没有编辑ssl.py容易的解决方案?



Answer 7:

我遇到过同样的问题:

提高SSLError(E)
requests.exceptions.SSLError:[错误8] _ssl.c:504:EOF发生违反协议的

我有提琴手运行,我停了下来小提琴手捕获并没有看到这个错误。 可能是因为小提琴手的。



Answer 8:

不幸的是,接受的答案并没有为我工作。 作为临时解决办法,你也可以使用verify=False连接到安全的网站时。

从Python的请求扔了SSLError

requests.get('https://example.com', verify=True)


Answer 9:

连接通过TLS一个RabbitMQ的MQTT服务器时,我有过这样的错误。 我敢肯定的服务器坏了,但无论如何它与OpenSSL的1.0.1的工作,但不是 OpenSSL的1.0.2。

你可以使用这个在Python检查版本:

import ssl
ssl.OPENSSL_VERSION

我不知道如何Python的内降级的OpenSSL(这似乎是静态地在Windows上至少连接),比使用Python的旧版本,等。



Answer 10:

我有类似的问题,我认为,如果我们简单地忽略ssl验证会像魅力它为我工作。 因此,连接到与服务器https方案,但引导他们不要来验证证书。

使用requests 。 只提verify=False ,而不是None

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

希望这会为那些谁需要:)工作。



文章来源: Python Requests requests.exceptions.SSLError: [Errno 8] _ssl.c:504: EOF occurred in violation of protocol