当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)

 

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐