首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Python请求requests.exceptions.SSLError:[Errno 8] _ssl.c:504: EOF违反协议

Python请求requests.exceptions.SSLError:[Errno 8] _ssl.c:504: EOF违反协议
EN

Stack Overflow用户
提问于 2012-12-31 21:51:59
回答 7查看 133.8K关注 0票数 64

我用的是ubuntu12.10,OpenSSL 1.0.1c,python 2.7.3,Requests 1.0.3和1.0.4 (都试过了),当我试图用下面的代码在url变量中连接网站时。

代码语言:javascript
复制
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

它抛出以下错误:

代码语言:javascript
复制
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进行连接将返回以下结果:

代码语言:javascript
复制
$ 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,它就会工作(输出被截断):

代码语言:javascript
复制
$ 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
---

我见过很多这样的bug reports;但是,我还没有找到一种使用python请求库来绕过它的方法。任何帮助都将不胜感激。

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2013-01-04 03:45:42

在这里为the requests issue page的其他人转发这篇文章

Requests‘在版本1之前不支持这样做。在版本1之后,您需要继承HTTPAdapter的子类,如下所示:

代码语言:javascript
复制
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)

完成此操作后,您可以执行以下操作:

代码语言:javascript
复制
import requests
s = requests.Session()
s.mount('https://', MyAdapter())

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

票数 47
EN

Stack Overflow用户

发布于 2014-06-11 23:10:56

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

此问题可能是由于web服务器上禁用了SSLv2造成的,但默认情况下,Python2.x会尝试与PROTOCOL_SSLv23建立连接。这发生在https://github.com/python/cpython/blob/360aa60b2a36f5f6e9e20325efd8d472f7559b1e/Lib/ssl.py#L1057

您可以通过覆盖ssl_version关键字参数来修补ssl模块中的ssl.wrap_socket()。以下代码可以按原样使用。在提出任何请求之前,请将这段代码放在程序的开头。

代码语言:javascript
复制
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)
票数 38
EN

Stack Overflow用户

发布于 2016-02-16 05:35:38

为我解决了为requests安装“安全”包的问题:

代码语言:javascript
复制
sudo apt-get install libffi-dev
sudo pip install -U requests[security]
票数 26
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14102416

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档