macOSで発生する 'ssl.SSLCertVerificationError: certificate verify failed' の解決方法

beginner🍎 macOS2026-05-30| macOS (Monterey, Ventura, Sonoma, Sequoia), Python 3.6 - 3.13 (python.org 公式インストーラー)

Error Message

ssl.SSLCertVerificationError: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate (_ssl.c:1129)
#python#ssl#macos#certifi#requests

SSLハンドシェイクの行き詰まり

突然のSSLハンドシェイク失敗ほど、効率的なコーディングセッションを中断させるものはありません。コードは Linux サーバー上では完璧に動作し、Safari ではURLが即座に読み込まれるのに、Python スクリプトはデータを取得しようとした瞬間に停止してしまいます。スタックトレースの最後には、頑固なエラーメッセージが残されます。

ssl.SSLCertVerificationError: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate (_ssl.c:1129)

これはコードのバグでもサーバーの故障でもありません。設定の不備です。Python.org が提供する macOS 用の公式インストーラーは、ルート証明書にシステムのキーチェーンを使用しません。代わりに、デフォルトでは無効になっている特定の証明書バンドルを探します。基本的には、Python が信頼できる認証局(DigiCert や Let's Encrypt など)のリストを探しても、見つからない状態なのです。

影響範囲の診断

まず、問題が Python だけに限定されているのか、システム全体に影響しているのかを確認しましょう。ターミナルで curl を使って簡単なテストを実行します。

curl -I https://google.com

もし HTTP/2 200 というレスポンスが表示されれば、macOS のネットワークスタックは正常です。問題は Python 内部の SSL モジュールに限定されています。バージョン3.6以降、macOS 上の Python は独自の OpenSSL を同梱していますが、権限の競合を防ぐために、システムの信頼ストアに自動的にリンクされることはありません。

解決策1:「ワンクリック」の公式な修正方法

Python.org の .pkg インストーラーを使用した場合は、小さなユーティリティスクリプトがすでにハードドライブに保存されています。この1KBのスクリプトは、約150以上のルート証明書を含む certifi パッケージをインストールし、Python が必要とするシンボリックリンクを作成します。

ターミナルを開き、特定のバージョン(例:3.12 や 3.13)に合わせて以下のコマンドを実行してください。

/Applications/Python\ 3.12/Install\ Certificates.command

どのバージョンを使っているかわからない場合は、ワイルドカードを使用した以下のコマンドで、スクリプトを自動的に見つけて実行できます。

open /Applications/Python\ 3.*/Install\ Certificates.command

処理が終わるまで5秒ほど待ちます。これにより pip が更新され、certifi がインストールされ、証明書パスがリンクされます。

解決策2:環境変数によるワークアラウンド

仮想環境や Homebrew でのインストールでは、Applications フォルダが完全にスキップされることがあります。このような場合、手動で Python に有効な証明書バンドルを指示することができます。まず、certifi ライブラリが存在することを確認してください。

pip install --upgrade certifi

次に、証明書ストアの正確なパスを確認します。

python -c "import certifi; print(certifi.where())"

通常、.../site-packages/certifi/cacert.pem のようなパスが返されます。この変更を永続的にするには、.zshrc(最近の macOS のデフォルトシェル)に環境変数を追加します。

echo "export SSL_CERT_FILE=$(python -c 'import certifi; print(certifi.where())')" >> ~/.zshrc
source ~/.zshrc

修正の検証

これで実際に動作するようになりましたか?基本的な Python ライブラリで HTTPS 接続ができるか、以下のスニペットで確認してください。

python3 -c "import urllib.request; print(urllib.request.urlopen('https://google.com').getcode())"

200 が返されれば、正常に復旧しています。もし requests ライブラリを使用している場合は、こちらも試してみてください。

python3 -c "import requests; print(requests.get('https://google.com').status_code)"

将来に向けたベストプラクティス

Windows、Linux、macOS の間を移動する場合、デフォルトの設定に頼るのは禁物です。

以下のルールを覚えておきましょう:

  • インストール後の習慣: macOS に新しい Python バージョンをインストールした直後は、必ず Install Certificates.command を実行するようにしましょう。
  • 仮想環境: システムの site-packages から孤立している場合、各環境で独自の certifi インストールが必要になることがあります。
  • 「Verify=False」の罠を避ける: 本番環境のアプリで verify=Falsessl._create_unverified_context() を使用してこのエラーを回避しないでください。暗号化の検証が無効になり、中間者攻撃(MITM)に対してデータが無防備になります。

Related Error Notes