Python SSL証明書エラーの原因と対処法
冒頭まとめ SSL: CERTIFICATE_VERIFY_FAILEDは、HTTPS接続先の証明書を検証できなかったときに出ます。まず、certificate verify failed:の後ろにある理由を確認してください。発行者の証明書が見つからない場合、期限切れの場合、接続先の名前が違う場合では、直す場所が変わります。 macOSでpython.org版を入れた直後なら、Install Certificates.commandの実行を確認します。社内ネットワークだけで失敗するなら、管理者が提供するCA証明書と、そのPythonが使う設定を確認してください。 verify=Falseで通っても証明書の問題は解消していません。相手の確認を省略しただけなので、検証を有効にしたまま接続できる状態へ直すのが基本です。 エラー文の末尾で原因を切り分ける Python標準のsslでは、次のような表示になります。行番号は説明用で、Pythonの版やビルドによって変わります。 ssl.SSLCertVerificationError: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate (_ssl.c:1007) SSLCertVerificationErrorはSSLErrorの一種で、Python公式文書ではPython 3.7で追加された例外とされています。Requests経由では、requests.exceptions.SSLErrorの中に証明書検証の失敗が表示されることがあります。 CPythonの実装では、検証結果に応じて末尾の文言を作ります。ホスト名・IPアドレスの不一致にはPython側の説明を使い、それ以外はOpenSSLの検証理由を使います。 末尾にある理由 最初に確認すること unable to get local issuer certificate 信頼するCAの設定と、サーバーが送る中間証明書 self-signed certificate 自己署名証明書を意図して使っているか、信頼設定があるか self-signed certificate in certificate chain 証明書の連鎖と、信頼の起点となるCA certificate has expired 証明書の期限と、実行環境の時計 Hostname mismatch / IP address mismatch URLの名前・IPアドレスと証明書の対象名 発行者を見つけられない理由は、手元のCA不足に限りません。サーバーが必要な中間証明書を送っていない場合もあります。OpenSSLの検証説明に沿って、接続先から信頼するCAまで証明書をたどれるかを確認します。 実行中のPythonと証明書の設定を確認する エラーが出たターミナル、仮想環境、CIジョブ、コンテナの中で確認します。以下のpythonは、失敗した処理で使うPythonのコマンド名に合わせてください。 python -c "import sys, ssl; print(sys.executable); print(ssl.OPENSSL_VERSION); print(ssl.get_default_verify_paths())" sys.executableは実行中のPython、get_default_verify_paths()は既定のCAファイル・ディレクトリや、関連する環境変数名を調べるために使います。Requestsを使っている場合は、そのCAファイルも別に確認します。 python -c "import requests; print(requests.certs.where())" Requestsの公式文書では、CA証明書にcertifiを使うと説明されています。標準のsslとRequestsが同じ信頼設定を使うとは限りません。 ...