快速回答
代理中的SSL: WRONG_VERSION_NUMBER是什么意思?
[SSL: WRONG_VERSION_NUMBER] 通过代理几乎总是意味着你的客户端对返回纯文本回复的目标发起了 TLS 握手。常见原因是在普通 HTTP 代理端口使用了 https:// 代理 URL。CrawlRelay 中,代理地址前应写 http://,对 HTTP 和 HTTPS 目标均适用;网站自己的 HTTPS 仍通过隧道正常工作。
SSL: WRONG_VERSION_NUMBER一览
| 错误 | SSL: WRONG_VERSION_NUMBER |
|---|---|
| 类型 | 客户端的 TLS 错误 |
| 发送方 | 当对端不使用 TLS 时你的 TLS 库报错 |
| 定义于 | TLS 1.3: RFC 8446; HTTP proxy CONNECT: RFC 9110, section 9.3.6 |
| 要重试吗? | 不是的,这是配置错误 |
| 先检查 | 查看你的代理 URL 前的协议头 |
SSL: WRONG_VERSION_NUMBER是什么意思?
TLS 握手从一条握手记录开始。如果返回的是 HTTP 响应,TLS 库读取了无效版本号便停止。Python 报告 WRONG_VERSION_NUMBER;具体描述随 OpenSSL 版本和客户端而异。
代理 URL 协议头决定客户端如何与代理通信。http:// 代表与代理用普通 HTTP 通信,之后通过 CONNECT 隧道与网站 TLS 通信。https:// 代表与代理本身使用 TLS(仅在代理端口支持 TLS 时有效)。
在Python、curl、Node.js和浏览器中SSL: WRONG_VERSION_NUMBER是什么样?
每个工具中相同的失败会有不同的提示信息。请在日志中搜索以下信息:
- Python requests / urllib3 2.x: 在
ProxyError中包装的SSLError(SSLError(1, '[SSL: WRONG_VERSION_NUMBER] wrong version number')) - httpx:
httpx.ConnectError: [SSL: WRONG_VERSION_NUMBER] wrong version number - curl: 当对普通代理写
-x https://时为curl: (35) ... wrong version number - Node.js: 错误消息中的
EPROTO ... wrong version number
导致SSL: WRONG_VERSION_NUMBER的原因是什么?
最可能的首要原因:
- 代理地址前使用
https://,但端口仅支持普通 HTTP。这是最常见的情况。 - 复制粘贴了代理端口需要 TLS 的设置。
- 端口为 80 但用的是
https://,或非代理的 TLS 端口用的是http://。 - 继承了环境变量,如
HTTPS_PROXY=https://...。
如何一步步诊断SSL: WRONG_VERSION_NUMBER?
- 打印代码使用的代理 URL,检查它的协议头。
- 检查环境变量中是否有
HTTPS_PROXY和ALL_PROXY。 - 用
-x http://运行下面的 curl 测试,确认它能工作。 - 如果 curl 正常而你的代码不行,说明代码或环境仍在使用
https://。
# Use the URL that fails; with https://api.ipify.org instead, you test the gateway alone.
# "HTTP/1.1 200 Connection established" first, then the site's own status: the site answered.
curl -v -x http://USERNAME:[email protected]:7777 https://TARGET_URL
# Same test through the SOCKS5 port, with DNS resolved at the exit
curl -v --socks5-hostname gw.crawlrelay.com:7778 --proxy-user USERNAME:PASSWORD https://TARGET_URL如何修复SSL: WRONG_VERSION_NUMBER?
- 所有代理相关键中使用
http://代理 URL:{"http": "http://...", "https": "http://..."}。 - 保持 TLS 验证开启。 修复在协议头,不是
verify=False。 - 修改环境变量,而不是在单个脚本中覆盖。
遇到SSL: WRONG_VERSION_NUMBER后要重试吗?
不要重试此错误:每次尝试都会同样失败。这是一个单字符的配置错误。
SSL: WRONG_VERSION_NUMBER如何应用于CrawlRelay?
CrawlRelay 的 HTTP 端口是纯 HTTP 代理端口,通过 CONNECT 隧道运输 HTTPS 网站。TLS 在客户端与网站间端到端运行,网关不需要 https:// 代理 URL。
网关:gw.crawlrelay.com,端口7777(通过CONNECT的HTTP、HTTPS)和端口7778(SOCKS5)。用户名格式:USERNAME-country-{cc}-state-{state}-city-{city}-zip-{zip}-asn-{asn}-session-{id}-ttl-{minutes}。相关内容:SSL 证书验证失败 · 无法连接到代理](/docs/errors/cannot-connect-to-proxy/) · Python 指南](/docs/python/)。
SSL: WRONG_VERSION_NUMBER:开发者常问的问题
使用 http:// 代理 URL 时流量会被加密吗?
对于 HTTPS 网站不是的。http:// 协议只涵盖与代理的简短 CONNECT 交换(包括凭据)。之后,客户端在隧道内直接与网站运行 TLS,代理仅转发加密数据。普通 http:// 网站无论是否代理均不加密。
为什么升级 urllib3 后开始出现这个问题?
urllib3 2.x 支持 HTTPS 代理,因此它字面理解 https:// 代理 URL 并启动与代理的 TLS。旧配置偶尔会因协议头错误误工作。对普通 HTTP 代理端口应写 http://,错误就会消失。
是否应该设置 verify=False 来消除错误?
不行。关闭证书验证无法修正错误的协议头,还会使每次请求都容易被中间人攻击。请正确设置代理 URL 协议头。在生产环境中始终保持验证开启。
本参考中的其他代理错误
HTTP 状态码
- 401 Unauthorized vs 407
- 403 Forbidden
- 407 Proxy Authentication Required
- 429 Too Many Requests
- 502 Bad Gateway
- 503 Service Unavailable
- 504 Gateway Timeout
浏览器和客户端错误
连接和 TLS 错误
带有涵盖失败案例文档的住宅代理
来自US$0.50/GB的CrawlRelay住宅代理,流量永不过期。