技術 · 實用指南
Python SSL 出現 WRONG_VERSION_NUMBER?先證明代理協定與 TLS 端點
先映射目標與代理協定、繼承設定、CONNECT 路徑和第一個回應端點,再更改憑證、TLS 版本或驗證。

WRONG_VERSION_NUMBER 通常代表預期的 TLS 邊界收到的位元組並非該連線的有效 TLS 記錄。常見原因是把 TLS 傳給只說明文 HTTP 的代理或連接埠,但不是唯一原因。
保留目標 URL、實際代理映射、環境與系統代理、CONNECT 行為和第一個回應端點。不要用 verify=False 把路由錯誤誤判成憑證問題。
固定失敗請求與所有代理來源
記錄 Python、Requests、urllib3、OpenSSL 版本、目標 URL、連接埠與完整例外鏈。保留 PreparedRequest,並列出參數、Session、環境與系統代理。
先不改信任或 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 的偶然成功。
