できない.dev

pip install が「SSL: CERTIFICATE_VERIFY_FAILED」でインストールできない

PyPI への TLS 接続で証明書を検証できないと pip はパッケージを取得できない。
多くは証明書バンドルが古い・社内プロキシの SSL 検査・時計のずれが原因で、certifi 更新や社内 CA の明示で解決する。

公開: 更新:

実行例あり(2026-08-13 に実環境で検証)

要約

pip install が SSL: CERTIFICATE_VERIFY_FAILED で止まるのは、pip が PyPI(pypi.org / files.pythonhosted.org)への HTTPS 接続で相手の証明書を検証できないため。

最短の切り分けは、まず証明書バンドルの更新です。python -m pip install --upgrade certifi を実行し、それでも直らなければプロキシや時計を疑います。
安易に --trusted-host で検証を切ると中間者攻撃の温床になるため、まず社内 CA 証明書と Python の証明書ストアを正しく使えるように直します。

実行例

python:3.12 から自己署名証明書のインデックスへ繋ぐと、まず [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: self-signed certificate が出て取得そのものが打ち切られる。
社内 CA を渡した後は同じコマンドでも証明書の検証エラーが消え、テスト用インデックスに該当パッケージが無いという別の理由での失敗に変わるため、証明書側だけが解消したことが読み取れる。pip config set global.cert を使うと、その CA のパスが ~/.config/pip/pip.conf に保存されて以降の実行にも引き継がれる。

$ pip install --disable-pip-version-check --retries 0 --index-url https://localhost:8443/simple/ sampleproject
Looking in indexes: https://localhost:8443/simple/
Could not fetch URL https://localhost:8443/simple/sampleproject/: There was a problem confirming the ssl certificate: HTTPSConnectionPool(host='localhost', port=8443): Max retries exceeded with url: /simple/sampleproject/ (Caused by SSLError(SSLCertVerificationError(1, '[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: self-signed certificate (_ssl.c:1010)'))) - skipping
ERROR: Could not find a version that satisfies the requirement sampleproject (from versions: none)
ERROR: No matching distribution found for sampleproject
pip の終了コード: 1
$ pip install --disable-pip-version-check --retries 0 --index-url https://localhost:8443/simple/ sampleproject
Looking in indexes: https://localhost:8443/simple/
ERROR: Could not find a version that satisfies the requirement sampleproject (from versions: none)
ERROR: No matching distribution found for sampleproject
pip の終了コード: 1(SSL エラーが消え、パッケージ未収録の 404 まで進めば CA の適用は成功)
$ pip config set global.cert /tmp/tmp.Uxm4YxxWIQ/corp-ca.pem
Writing to /root/.config/pip/pip.conf
$ pip config list
global.cert='/tmp/tmp.Uxm4YxxWIQ/corp-ca.pem'
$ pip install --disable-pip-version-check --retries 0 --index-url https://localhost:8443/simple/ sampleproject
Looking in indexes: https://localhost:8443/simple/
ERROR: Could not find a version that satisfies the requirement sampleproject (from versions: none)
ERROR: No matching distribution found for sampleproject
pip の終了コード: 1

— 2026-08-13 時点の出力

検証環境

検証日
実行環境
python:3.12

この記事の「実行例」は、上記の環境で実際にコマンドを実行して得られた出力をそのまま掲載しています。 再現手順はリポジトリの検証スクリプトとして管理し、定期的に再実行して出力を更新しています。

よくある原因

  1. 証明書バンドルが古い: Python が参照する CA 証明書(certifi)が古く、PyPI 側の証明書チェーンを検証できない。
  2. SSL 検査プロキシ: 社内ネットワークのプロキシが通信を復号し、独自の中間証明書を差し込むため、標準の CA では検証が通らない。
  3. 時計のずれ: 端末の日時が大きく狂っていると、証明書の有効期間チェックに失敗する。
  4. 古い pip / Python: バージョンが古く、現在の TLS 構成や証明書に追従できていない。
  5. macOS の証明書未インストール: python.org 公式インストーラ同梱の Install Certificates.command が未実行。
  6. 自己署名の社内ミラー: 社内 PyPI / devpi が独自 CA で署名されている。

解決策

1. 証明書を更新する

まず証明書バンドルを最新化します。

python -m pip install --upgrade certifi pip

2. 社内 CA を信頼させる

SSL 検査環境では、配布されている社内 CA を pip に渡します。

pip install --cert /path/to/corp-ca.pem requests

環境変数で渡す方法もあります。
pip 以外のツール(requests など)にも同時に効きます。

export REQUESTS_CA_BUNDLE=/etc/ssl/certs/corp-ca.pem
export SSL_CERT_FILE=/etc/ssl/certs/corp-ca.pem
pip install <pkg>

恒久化するなら pip の設定に書きます。

pip config set global.cert /etc/ssl/certs/corp-ca.pem

pip config は ~/.config/pip/pip.conf(Windows は pip.ini)へ書き込まれ、毎回の指定が要らなくなります。

3. macOS 公式インストーラの後処理

/Applications/Python 3.x/Install Certificates.command

このスクリプトが certifi の証明書を OpenSSL 側に紐付けます。python.org のインストーラを使う場合は必須です。

4. 暫定回避(信頼ホスト)

急ぐときだけ --trusted-host で検証を回避できますが、中間者攻撃のリスクがあるため恒久利用は避けます。

pip install --trusted-host pypi.org --trusted-host files.pythonhosted.org requests

時刻のずれが原因のこともあるため、システムの日時設定もあわせて確認してください。

この記事は役立ちましたか?