科技 · 實用指南
Python SSLCertVerificationError:修改信任前先確認憑證擁有者
保持驗證開啟。記錄請求名稱、SNI、對端 SAN、簽發者、代理路徑與實際 CA bundle,再修正真正擁有錯配的元件。

SSLCertVerificationError 是判定,不是單一根因。同類例外可能來自不受信鏈、過期憑證、錯誤時鐘、主機名不符、IP 直連、錯誤虛擬主機、HTTPS 代理或程序未載入的 CA bundle。
安全的第一步不是 verify=False。從相同程序與網路路徑重現,記錄請求對象、實際回應者、憑證身分與信任庫。
凍結完整失敗請求
記錄完整 URL、port、Python/OpenSSL 與函式庫版本、proxy 變數、verify 或 CA 設定,以及完整例外訊息。不要把證據縮成 CERTIFICATE_VERIFY_FAILED。
必須從相同程序身分與網路路徑重現;瀏覽器、curl、container、排程工作與 virtual environment 可能使用不同 proxy 或 trust store。
先寫清端點身分
分開記錄 URL 主機名、連線 IP、SNI 主機名與 HTTP Host。一般呼叫中它們一致,IP URL、proxy tunnel 或自訂 adapter 會拆開它們。
TLS 憑證選擇與主機名驗證早於 HTTP。只改 Host header 不能把對 IP 的 TLS 預期改成 DNS 名稱。
分類驗證失敗
主機名不符時,對照預期名稱與 peer 憑證 subjectAltName;增加 CA 無法修正缺少的名稱。鏈錯誤要查 issuer path 與此 client 實際載入的 CA bundle;有效期錯誤也要查 runtime clock。
若 issuer 屬於企業安全產品而非 origin,確認是否啟用了核准的 HTTPS proxy。信任企業 CA 是受管環境的政策決定。
套用單一責任方修正
憑證 SAN 缺正式 DNS 名時修 server;client 問錯身分時修 URL 或 SNI;proxy 是預期擁有者時才修 routing 或安裝核准企業 CA;程序未載入 CA 時修函式庫設定。
一次只改一項並保留 verify=True。私有 CA 優先綁定專用 Session 或 PoolManager,不要擴大無關主機的全域信任。
驗證成功與拒絕路徑
重複完全相同的 request,記錄 peer subject、SAN、issuer、預期名稱、CA 來源與 proxy 狀態,並確認 response 確實屬於目標服務。
加入負向測試:錯誤主機名、未核准根或應失敗的無 proxy 路徑必須繼續被拒絕。
