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
ベストプラクティス
- 常に
certifi
を最新に保つ - 環境変数
SSL_CERT_FILE
で明示的なパス指定 - 本番環境では証明書検証の無効化を絶対に回避
- 企業ネットワークではプロキシ提供の証明書を正しく配置
これらの対策を実装することで、SSL/TLS通信における信頼チェーンの検証が正常に行えるようになります。環境に応じた最適な方法を選択してください。