テクノロジー · 実用ガイド

Python SSLCertVerificationError:trust を変える前に証明書の所有者を特定する

検証を有効に保ち、要求名、SNI、peer SAN、issuer、proxy 経路、実際の CA bundle を記録して、本当の所有者だけを修正します。

Original diagram tracing a Python HTTPS request from URL and CA bundle through SNI and proxy to peer certificate SANs and issuer.
オリジナルイラスト:trust を変える前に client、route、peer identity を記録する。 Watch at Ease

SSLCertVerificationError は単一原因ではありません。chain、期限、clock、hostname、IP URL、virtual host、HTTPS proxy、CA path のどこでも発生します。

最初の操作は verify=False ではありません。同じ process と network path で再現し、誰に要求し、誰が応答し、どの identity と trust store が使われたかを記録します。

失敗した request を固定する

完全な URL と port、Python/OpenSSL と library の version、proxy 環境変数、verify または CA 設定、完全な例外を記録します。証拠を CERTIFICATE_VERIFY_FAILED 一語に縮めません。

同じ process identity と network path で再現します。browser、curl、container、scheduled job、virtual environment は異なる proxy や trust store を使う場合があります。

chain の前に endpoint を特定する

URL hostname、接続 IP、SNI hostname、HTTP Host header を別々に記録します。通常は一致しますが、IP URL、proxy tunnel、custom adapter では分離します。

TLS の証明書選択と hostname 検証は HTTP より先です。Host header だけでは IP を期待した TLS identity を DNS 名へ変えられません。

verification failure を分類する

hostname mismatch では期待名と peer の subjectAltName を比較します。CA 追加では欠けた名前を修正できません。chain error では issuer path と実際に読み込まれた CA bundle、期限 error では runtime clock も確認します。

issuer が origin ではなく企業 security 製品なら、承認済み HTTPS proxy が有効か確認します。企業 CA の信頼は managed environment の policy 判断です。

所有者だけを修正する

SAN に production DNS 名がなければ server、誤った identity を要求したなら URL/SNI、意図した proxy が所有者なら routing または承認 CA、process が CA を未読なら library 設定を修正します。

一度に一つだけ変更し verify=True を保ちます。private CA は専用 Session または PoolManager に限定します。

成功と拒否を両方証明する

同じ request を再実行し、peer subject、SAN、issuer、期待名、CA source、proxy 状態を記録し、応答が目的 service のものか確認します。

wrong hostname、未承認 root、または失敗すべき proxy 無効経路の negative test を追加し、拒否が残ることを証明します。

Original decision diagram separating hostname ownership from certificate-chain ownership while verification remains enabled.
オリジナルイラスト:hostname と chain は別の修正所有者を持つ。 Watch at Ease