Watch at Ease看见世界,读懂生活。

技术 · 实用指南

Python SSL 报 WRONG_VERSION_NUMBER?先证明代理协议与 TLS 端点

先映射目标与代理协议、继承设置、CONNECT 路径和第一个响应端点,再改证书、TLS 版本或验证策略。

原创示意图:HTTP/HTTPS 目标与代理的四格路由矩阵。
原创示意图:目标与代理协议描述不同跳点;先证明 TLS 从哪里开始。 Watch at Ease

WRONG_VERSION_NUMBER 通常表示预期的 TLS 边界收到的字节并不是该连接的有效 TLS 记录。常见原因是把 TLS 发到只讲明文 HTTP 的代理或端口,但这不是唯一原因。

保留目标 URL、实际代理映射、环境与系统代理发现、CONNECT 行为和首个响应端点。不要用 verify=False 把路由错误误判为证书问题。

冻结失败请求与所有代理来源

记录 Python、Requests、urllib3、OpenSSL 版本、目标 URL、端口与完整异常链。保留 PreparedRequest,并列出参数、Session、HTTP_PROXY、HTTPS_PROXY、ALL_PROXY、NO_PROXY 与系统代理。

先不改信任或 TLS 版本。用无敏感数据的目标比较干净环境与预期代理策略;直连成功而代理失败能缩小到路由。

分别映射目标协议与代理协议

urllib3 记录了四种路由。HTTP 代理可用 CONNECT 承载 HTTPS 目标;HTTPS 代理则要求客户端先和代理建立 TLS。

所以 HTTPS_PROXY=http://proxy:port 可能完全正确。变量名不决定代理协议,只有确认该端口真的支持 TLS 才能使用 https://。

证明第一个收到 TLS 字节的端点

从实际配置解析代理主机与端口,记录是否发送 CONNECT,以及首个响应像明文 HTTP、代理认证还是 TLS 握手。调试时删去日志中的凭据。

策略允许时也直测目标端口。https://host:port 如果指向普通 HTTP 监听器也会失败;负载均衡、拦截网关或端口映射也可能造成同类现象。

把证书与协议错误分到其他分支

CERTIFICATE_VERIFY_FAILED 表示已到证书验证阶段;verify=False 不能把明文端点变成 TLS。WRONG_VERSION_NUMBER 更早发生在记录或协议解析。

UNSUPPORTED_PROTOCOL 是另一分支。只有确认选中跳点确实讲 TLS 后,才比较 SSLContext 与服务端支持的版本,不能为明文端点降低全局 TLS。

只修一个配置来源并证明收口

修正真正提供错误路由的来源:请求映射、Session、进程或服务环境、系统代理或部署密钥。HTTP 代理即使服务 HTTPS 目标,URL 仍应是 http://。

保持验证开启重试,确认代理跳点、必要的 CONNECT、目标证书和正常响应;再重启真实任务一次,证明成功不是临时干净 shell 的偶然结果。

原创示意图:从请求、代理来源到线缆边界与安全收口。
原创示意图:修改证书或 TLS 策略前先冻结路由证据。 Watch at Ease