← 中文资源

简体中文版本

Python 使用 HTTPS 时报 SSLError: wrong version number

通过确认端点是否真的在讲 TLS、或是否处在配置错误的代理之后,诊断 SSL 的 wrong version number 错误。

阅读英文原文

症状

HTTPS 请求以 SSLError: WRONG_VERSION_NUMBER 失败,意味着 TLS 握手收到的字节并非合法的 TLS 记录。常见原因是向纯 HTTP 端口发送 TLS、代理改写了连接或路由错误,或 TLS 检测设备使用了不受信任的证书。消息指向 TLS,但缺陷通常在地址或网络路径上。

诊断

用 openssl s_client 确认端口是否真的讲 TLS;用 curl 对比纯 HTTP;检查代理环境变量并尝试绕过代理。

openssl s_client -connect host:443 -servername host < /dev/null

根因

客户端开始 TLS 握手,但服务器或中间层以非 TLS 内容响应,于是握手把明文字节解析为错误的 TLS 版本。

修复

使用服务正确的协议与端口;修正代理或负载均衡的配置,使 TLS 正确终止与转发;对合法的检测代理应把其证书装入信任库,而非关闭校验。

验证

对修正后的端点重发请求确认成功,再用 openssl 检查证书链确认签发者与主机名符合预期。受信任的证书链加上成功响应即证明路径正确。

常见陷阱

为绕过该错误而全局关闭证书校验会暴露中间人攻击;应修正路径或正确信任证书。