Python使用http.client发送代理GET请求出现SSL:WRONG_VERSION_NUMBER错误
错误原因
出现SSL: WRONG_VERSION_NUMBER报错的核心原因是你错误使用HTTPSConnection连接普通HTTP代理:普通HTTP代理的服务端口默认走明文HTTP协议,你用HTTPS协议发起握手,两端协议不匹配就会触发SSL版本错误。
解决方案
根据你的使用场景选择对应修改方案即可:
场景1:使用普通HTTP代理请求HTTP站点
直接将HTTPSConnection替换为HTTPConnection即可解决问题,修改后的代码如下:
import http.client r = http.client.HTTPConnection("代理IP", "代理端口") r.request('GET', "http://httpbin.org/get" , headers={"Host": "httpbin.org"}) res = r.getresponse() print(res.read().decode())
场景2:使用普通HTTP代理请求HTTPS站点
如果后续需要通过代理请求HTTPS协议的站点,需要先向代理发送CONNECT请求建立隧道,再发送业务请求,代码示例如下:
import http.client r = http.client.HTTPConnection("代理IP", "代理端口") # 建立到目标站点443端口的隧道 r.set_tunnel("httpbin.org", 443) # 仅填写站点内路径即可 r.request('GET', "/get") res = r.getresponse() print(res.read().decode())
场景3:使用HTTPS协议连接代理
如果确认你的代理本身要求走HTTPS协议连接,可以手动指定SSL上下文匹配代理支持的TLS版本,代码示例如下:
import http.client import ssl # 可根据代理支持的TLS版本调整协议类型,常用为PROTOCOL_TLSv1_2、PROTOCOL_TLSv1_3 context = ssl.SSLContext(ssl.PROTOCOL_TLSv1_2) r = http.client.HTTPSConnection("代理IP", "代理端口", context=context) r.set_tunnel("httpbin.org", 443) r.request('GET', "/get") res = r.getresponse() print(res.read().decode())
内容的提问来源于stack exchange,提问作者Rubs 01
相关产品推荐
相关产品推荐

