Python requests 中与 curl --proxy-insecure 对等的代理SSL免校验配置
场景问题说明
- 现有代码中设置的
verify=False仅作用于最终目标站点的TLS证书校验,等价于curl的-k参数,不会影响与HTTPS代理建立连接时的证书校验流程 - requests 默认会对HTTPS代理节点执行完整的TLS证书校验,和curl默认行为一致
- 运行原代码抛出的
ValueError: check_hostname needs a SSL context with either CERT_OPTIONAL or CERT_REQUIRED,是早期版本requests在处理代理SSL连接时,全局配置与代理连接的上下文参数不匹配触发的校验冲突
requests 环境下的对等实现
要实现和curl --proxy-insecure 完全对等的“关闭代理自身SSL证书校验”能力,不需要切换第三方库,可以通过自定义HTTP适配器的方式,为代理连接单独配置关闭校验的SSL上下文,完全兼容现有requests接口:
import requests from requests.adapters import HTTPAdapter from urllib3.util.ssl_ import create_urllib3_context import ssl # 自定义适配器:针对HTTPS代理连接使用关闭校验的SSL上下文 class InsecureProxyAdapter(HTTPAdapter): def init_poolmanager(self, *args, **kwargs): # 创建urllib3兼容的SSL上下文 proxy_ctx = create_urllib3_context() # 关闭主机名校验、关闭证书链校验,等效代理侧的--proxy-insecure proxy_ctx.check_hostname = False proxy_ctx.verify_mode = ssl.CERT_NONE kwargs["ssl_context"] = proxy_ctx return super().init_poolmanager(*args, **kwargs) # 初始化请求会话 session = requests.Session() # 为HTTPS请求挂载自定义适配器 session.mount("https://", InsecureProxyAdapter()) # 配置HTTPS代理地址 session.proxies = { "https": "https://login:password@eu-west-shield-01.quotaguard.com:9294" } # 发起请求,verify=False 仅关闭目标站点的证书校验(等效curl -k) response = session.get("https://ip.quotaguard.com", verify=False) print(response.text)
- 上述实现的效果和curl命令
curl -x "https://login:password@eu-west-shield-01.quotaguard.com:9294" -L "https://ip.quotaguard.com" --proxy-insecure -k完全一致 - 自定义适配器的SSL上下文仅用于代理侧的TLS连接,不会覆盖请求中
verify参数对目标站点的校验配置
简化实现的替代库推荐
如果不想编写自定义适配器代码,可以选择原生支持代理侧SSL校验配置的Python HTTP库:
httpx:作为requests风格的现代HTTP客户端,支持直接在会话配置中指定是否校验代理证书,不需要自定义适配器aiohttp:异步HTTP客户端,在配置TCP连接池时,可以单独为代理连接指定关闭校验的SSL上下文
内容的提问来源于stack exchange,提问作者Vladimir Pankov
相关产品推荐
相关产品推荐

