HTTPSConnection 发生错误ssl.SSLEOFError: EOF occurred in violation of protocol (_ssl.c:841)

当request的时候出现错误ssl.SSLEOFError: EOF occurred in violation of protocol (_ssl.c:841)

conn = httplib.HTTPSConnection(host, port)
conn.request('GET', path, params, headers)

在网上一番查询后目前怀疑是ssl协议版本不对应导致,目前尝试的方法有:

方法一:(失败)

下载一些库来补全

pip install pyopenssl ndg-httpsclient pyasn1

pip install -U urllib3

pip install -U channels

pip --cert /Users/user/cacert.pem install -U channels

pip install requests[security]

方法二:(失败)

在连接建立前重写SSL使用的版本

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

    return bar

ssl.wrap_socket = sslwrap(ssl.wrap_socket)

方法三:(失败)

在HTTPSConnection处context参数改变协议

context = ssl.SSLContext(ssl.PROTOCOL_TLS)
conn = httplib.HTTPSConnection(host, port,context=context)

 最终解决方法和原因:

因为未知力量的,为了让代码能连上服务器,所以用了全局代理,使用了软件Proxifier,但是不知道为什么,当使用Proxifier去访问带有SSL的网址时会得不到回复(本端会向对端发送请求,但是对端没有回复,个人猜测是被Proxifier拦截了,或者说Proxifier无法解析,导致到了对端结果信息出现了错误,所以才会报错ssl.EOF)

所以最终在连接处带上代理

conn = httplib.HTTPSConnection(host, port)

import socks
import socket

socks.set_default_proxy(socks.SOCKS5, proxy_host, proxy_port)
socket.socket = socks.socksocket

conn.sock = socket.socket()
conn.sock.connect((host, port))

此时可以交互了,但是又遇到了新问题(orz):

使用这种方式发送的socks5交互是没转码的,即:

b'GET / HTTP/1.1\r\nHost: www.google.com\r\nAccept-Encoding: identity\r\n\r\n'

但是用requests模块发送请求的是这样的:

b"\x16\x03\x01\x00\xfb\x01\x00\x00\xf7\x03\x03\x80?\xcd\n\xb3\x90b\xcc\xf9\xc6\x0e\x01\x98Iw\xf3:\xe2\x17\xfa\x17\xc1\t\xce\xb4)\x01\x15t\x1bI)\x00\x00b\xc00\xc0,\xc0/\xc0+\x00\x9f\x00\x9e\xc02\xc0.\xc01\xc0-\x00\xa5\x00\xa1\x00\xa4\x00\xa0\xc0(\xc0$\xc0\x14\xc0\n\xc0*\xc0&\xc0\x0f\xc0\x05\xc0'\xc0#\xc0\x13\xc0\t\xc0)\xc0%\xc0\x0e\xc0\x04\x00k\x00i\x00h\x009\x007\x006\x00g\x00?\x00>\x003\x001\x000\x00\x9d\x00\x9c\x00=\x005\x00<\x00/\x00\xff\x01\x00\x00l\x00\x00\x00\x13\x00\x11\x00\x00\x0ewww.google.com\x00\x0b\x00\x04\x03\x00\x01\x02\x00\n\x00\x1c\x00\x1a\x00\x17\x00\x19\x00\x1c\x00\x1b\x00\x18\x00\x1a\x00\x16\x00\x0e\x00\r\x00\x0b\x00\x0c\x00\t\x00\n\x00#\x00\x00\x00\r\x00 \x00\x1e\x06\x01\x06\x02\x06\x03\x05\x01\x05\x02\x05\x03\x04\x01\x04\x02\x04\x03\x03\x01\x03\x02\x03\x03\x02\x01\x02\x02\x02\x03\x00\x0f\x00\x01\x01"

——————————————————————分隔符————————————————————————

最后发现还是SSL作怪,需要socket建立连接之后,在建立SSL的sock连接去验证SSL

解决方案:

conn = httplib.HTTPSConnection(host, port)

import socks
import socket

socks.set_default_proxy(socks.PROXY_TYPE_SOCKS5, proxy_host, proxy_port)

conn.sock = socks.socksocket()
conn.sock.connect((host, port))

if port == 443:
    conn.sock = ssl.wrap_socket(conn.sock)

 

  • 14
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 14
    评论
### 回答1: 这个错误指出SSL协议出现错误,具体为在协议中违反了某些规定导致连接被关闭(eof occurred in violation of protocol)。该错误通常出现在使用SSL套接字时,可能是由于SSL握手失败或者SSL通信中出现了异常。 ### 回答2: 该错误是一个Python语言中的SSL库经常会出现的一个错误。这个错误通常由于与协议相关的问题引起,表现为与SSL握手没有成功地完成。有很多情况,该问题是发生在使用第三方库或模块与HTTPS网站通信时。 可能是您正在访问的服务器使用了旧的SSL / TLS协议,而您正在尝试使用新的证书或新的协议连接。此时就需要升级您当前使用的SSL / TLS协议版本,以便与目标服务器正常通信。您可以尝试升级到较新的版本,例如TLS 1.2或TLS 1.3。 进一步,也可能是证书mismatch导致的问题。如果是这种情况,您应该检查您正在使用的证书是否与服务器的证书匹配。确保证书有效期内,并且您成功验证了证书是否签名。 最好的办法是使用Python中的ssl配置客户端请求。您可以使用Python中的ssl.get_default_verify_paths()函数获取信任的证书列表,并通过该列表验证SSL / TLS握手。这样可以提高代码的可移植性,并且确保您正在访问的目标服务器的证书是经过验证的。此外,可以尝试使用不同的Python库或包,例如requests或aiohttp,以简化HTTPS请求的处理和配置。 ### 回答3: 这个错误通常在处理SSL连接时出现,它指示在SSL握手或数据传输期间连接被异常关闭,可能是由于另一端的错误终止或网络中断等原因。 常见的情况是,服务器在SSL握手过程中发送了一个错误的证书或加密信息,导致连接被关闭。在这种情况下,应确保服务器证书和配置正确,并检查与服务器通信的加密协议和算法是否配置正确。 另外,这个错误有可能是由于网络连接不稳定引起的。在这种情况下,应根据错误上下文识别问题并尝试重新连接。可能需要开启重连机制和心跳消息来保持连接,从而避免这种错误。 总之,处理SSL握手和数据传输时,需要密切关注连接状态和错误提示,确保服务器和客户端的配置正确,并使用稳定的网络连接。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 14
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值