Skip to content

SSL_CERTIFICATE_VERIFY_FAILEDエラーの解決方法

環境変数の設定を確認しているにもかかわらず発生するSSL証明書検証失敗エラー `[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate (_ssl.c:1129)』への対処法を解説します。

問題の本質

このエラーは、SSL/TLS通信時にPythonがサーバー証明書を検証できない状況で発生します。具体的には次の原因が考えられます:

  • OSの証明書ストアへのパスがPythonから認識されていない
  • ローカルの認証局(CA)証明書が古い/不足している
  • 企業プロキシ(Zscalerなど)が独自証明書を使用している
  • Python環境のCA証明書バンドルが更新されていない

推奨解決策(環境ごとのアプローチ)

✅ 1. certifiパッケージを使用したCA証明書の更新

Pythonの信頼できるCA証明書バンドルを更新することで解決できます。

python
# certifiのインストール/アップグレード
pip install --upgrade certifi
bash
# 環境変数に証明書パスを設定(永続化する場合は~/.bashrc等に追加)
export SSL_CERT_FILE=$(python -c "import certifi; print(certifi.where())")

✅ 2. Homebrew環境での証明書設定(macOS)

HomebrewでインストールしたPythonの場合:

bash
# certifiのインストール
python3 -m pip install certifi

# 環境変数設定(.zshrcや.bash_profileに追加推奨)
echo 'export SSL_CERT_FILE=$(python3 -m certifi)' >> ~/.zshrc
source ~/.zshrc

✅ 3. システムの証明書ストアを利用する方法

python
import ssl
context = ssl.create_default_context()
context.load_verify_locations(capath='/etc/ssl/certs/')  # Linux
# context.load_verify_locations(cafile='/usr/local/etc/openssl/cert.pem')  # macOS Homebrew

タイムリーな注意点

2025年4月のcertifi問題

2025年4月リリースのcertifi 2025.4.26に互換性問題が報告されています。問題が発生する場合はバージョンを固定してください:

bash
pip install certifi==2025.1.31  # 安定版にダウングレード

一時的な回避策(開発環境限定)

セキュリティ警告

本番環境では絶対に使用しないでください。中間者攻撃のリスクがあります。

python
import ssl

# 証明書検証を一時無効化(非推奨)
ssl._create_default_https_context = ssl._create_unverified_context

# 後で検証を再度有効化する場合
# ssl._create_default_https_context = orig_ssl_context

OSごとの追加対策

macOS

bash
# 証明書更新コマンドの実行(Python標準インストーラー時)
/Applications/Python\ 3.x/Install\ Certificates.command

Windows(プロキシ環境)

企業プロキシを使用する場合:

python
import os
os.environ['SSL_CERT_FILE'] = 'C:\\Path\\To\\Your\\Proxy\\Certificate.pem'

Ubuntu/Debian

bash
# システム証明書の更新
sudo cp new_cert.crt /usr/local/share/ca-certificates/
sudo update-ca-certificates

根本原因の特定方法

問題の切り分けに次のコマンドが有効です:

bash
# 現在使用中のCAバンドルパス確認
python -c "import ssl; print(ssl.get_default_verify_paths().cafile)"

# certifiの証明書パス確認
python -m certifi

ベストプラクティス

  1. 常にcertifiを最新に保つ
  2. 環境変数SSL_CERT_FILEで明示的なパス指定
  3. 本番環境では証明書検証の無効化を絶対に回避
  4. 企業ネットワークではプロキシ提供の証明書を正しく配置

これらの対策を実装することで、SSL/TLS通信における信頼チェーンの検証が正常に行えるようになります。環境に応じた最適な方法を選択してください。