はじめに
目的
この文書は「ssl pip」という検索意図を踏まえ、pip実行時に起きるSSL/TLS関連の問題を分かりやすく整理することを目的としています。原因の特定方法と実用的な対処法を中心に解説します。
背景
pipはPyPIなどからパッケージをHTTPSで取得します。HTTPSは通信の暗号化とサーバーの真正性確認を行いますが、証明書の不一致や古い暗号ライブラリ、企業ネットワークの中間証明書などでエラーが発生します。具体例としては「証明書の検証失敗」「TLSハンドシェイクの失敗」などがあります。
対象読者
Pythonを使っていてpipでパッケージをインストールできない方、システム管理者、開発環境を整えたい方に向けています。初心者でも理解できるよう、専門用語は最小限に絞り具体例で補足します。
本書の構成と読み方
以降の章でpipとSSL/TLSの関係、代表的なエラーメッセージ、原因ごとの対処法(古いPython/OpenSSL、CA証明書の問題)を順に解説します。問題が起きた時に手順を追って対応できるように書いています。
pip と SSL/TLS の関係を理解する
概要
pip は Python パッケージを PyPI やその他のリポジトリから HTTPS 経由で取得します。HTTPS は SSL/TLS を使って通信を暗号化し、通信相手(サーバー)の身元を確認します。pip は Python の標準ライブラリ(ssl モジュールなど)や組み込みの HTTPS クライアントを利用して、この証明書検証を行います。
HTTPS と SSL/TLS の役割
- 暗号化:通信内容を第三者から見えないようにします。例えば、パスワードやパッケージ内容を保護します。
- 認証:接続先が正しいサーバーかを確認します。証明書とルート CA により検証します。
pip がどのように検証するか
pip は接続先のサーバー証明書を受け取り、シグネチャが信頼できるルート証明書に連なるかを確認します。検証には OS に備わるルート証明書、Python 環境に入っている証明書、あるいは pip に同梱される CA バンドルのいずれかを使います。検証に失敗すると SSL 関連のエラーになります。
実際に起こる場面と注意点
- OS や Python(OpenSSL)が古く、最新のルートやアルゴリズムに対応していない場合、接続が拒否されます。
- 企業ネットワークでプロキシが通信を復号・再署名(社内 CA を使用)する環境では、その社内 CA を信頼させる必要があります。
- ローカルで証明書ストアが壊れていたり、カスタム証明書を使っていると検証エラーになります。
これらの仕組みを理解すると、pip の SSL エラーが発生したときに原因の切り分けがスムーズになります。
よくある pip の SSL エラーメッセージ
以下はpip実行時によく出るSSL関連のエラーと、わかりやすい説明・確認方法です。
SSL: CERTIFICATE_VERIFY_FAILED(証明書検証失敗)
意味:サーバ証明書を検証できないため接続を拒否します。多くはCA証明書が見つからないか、署名が一致しないことが原因です。
確認方法:ブラウザで同じURLを開いて警告が出るか確認します。システムの日付が正しいかもチェックしてください。
対応のヒント:certifiパッケージを使う、Python/OpenSSLを更新する、プロキシがある環境ならプロキシ証明書のチェーンを確認します。安全でない回避策として–trusted-hostは一時的にのみ使ってください。
TLSV1_ALERT_PROTOCOL_VERSION(TLSバージョン非互換)
意味:サーバとクライアントで使えるTLSのバージョンが合いません。古いOpenSSLや古いPythonを使うと発生します。
確認方法:pipやPythonのバージョン、OpenSSLのバージョンを確認します。
対応のヒント:PythonまたはシステムのOpenSSLを新しくすることが解決策です。
There was a problem confirming the ssl certificate(一般的な証明書検証失敗)
意味:検証が失敗したことを示す一般メッセージです。原因は上記のどれかであることが多いです。
確認方法と対応:上の項目を順に確認してください。
プロキシ経由のエラー(ProxyErrorや証明書検証失敗)
意味:社内プロキシやセキュリティ製品が中間で証明書を差し替えている可能性があります。
確認方法:プロキシ設定を確認し、プロキシのルート証明書がシステムにインストールされているか確認します。
対応のヒント:組織の証明書を信頼するよう設定するか、IT部門に証明書チェーンの確認を依頼してください。
以上のエラーはHTTPS通信が安全に確立できないことを示します。原因は主に「Python/OpenSSLの古さ」「CA証明書ストアの問題」「プロキシやセキュリティ製品による差し替え」「システム日時のずれ」に分類できます。各項目を順に確認すると解決に近づきます。
原因①:Python/OpenSSL が古い場合の対処
概要
PythonのSSL機能は内部でOpenSSLなどの暗号ライブラリを使っています。古いPythonやOSでは、サーバー側が要求するTLSのバージョンや暗号方式に対応していないことがあり、pipで接続できない原因になります。
確認方法(簡単な例)
- Pythonが参照しているOpenSSLのバージョンを調べる:
python -c “import ssl; print(ssl.OPENSSL_VERSION)” - pipのバージョン確認:
pip –version
これで古いバージョンなら更新を検討します。
対処1:Python自体をアップデートする
最も確実な解決方法は、公式の新しいPythonを入れることです。Windowsなら公式インストーラー、macOSならHomebrewか公式、Linuxならパッケージ管理か公式ビルドを使います。新しいPythonは最新のOpenSSLを同梱していることが多く、SSL問題が解消します。
対処2:OSのOpenSSLを更新する
Linuxではapt/yumなどでOpenSSLを更新します。macOSはHomebrewでopensslを入れてから、PythonをそのOpenSSLにリンクし直す必要があります。環境によってはOS全体のアップグレードが必要になる場合があります。
古い環境でpipを使う必要がある場合の回避策
- 新しい環境でwheelを作って持ち込む:別のマシンで
pip wheel <パッケージ> -w ./wheels
を実行し、対象環境にコピーして
pip install –no-index –find-links ./wheels <パッケージ>
とします。 - 社内環境向けに簡易リポジトリを用意する方法:devpiなどで内部PyPIを構築して必要なパッケージをキャッシュすると便利です。
注意点
- 単にpipをアップデートしても、Pythonが古ければ解決しないことがあります。まずssl.OPENSSL_VERSIONで確認してください。
原因②:CA 証明書・証明書ストアの問題とその設定
はじめに
pipは接続先サーバーの証明書を、OSやPythonが持つCA証明書ストアで検証します。社内プロキシやゲートウェイが自社CAで署名した証明書を返すと、そのCAが登録されていない環境では検証が失敗します。
何を用意するか
- 社内CAの公開鍵証明書(PEM形式)。多くの場合「.crt」や「.cer」をテキスト形式(—–BEGIN CERTIFICATE—– から始まる)で保存すればPEMになります。
対処手順(例)
1) PEM ファイルを作る
– 既存のCA証明書をエクスポートして、ca_company.pem のように保存します。
2) 既存のCAバンドルに追記する
– 既存のバンドル(例: /etc/ssl/certs/ca-bundle.crt)に追記するとシステム全体で使えます。管理者権限で行ってください。
3) pip に個別ファイルを指定する
– 環境変数(Unix/macOS)
export PIP_CERT=”/path/to/ca_company.pem”
– Windows(PowerShell)
setx PIP_CERT “C:\path\to\ca_company.pem”
– pip 設定ファイル(ユーザーまたは全体)
[global]
cert = C:\path\to\ca_company.pem
注意点と代替策
- 証明書をシステムの信頼ストアに登録すると他のツールでも動きます。管理者と相談してください。
- 一時的に検証を無効化する –trusted-host は安全性が下がるため、特別な理由がない限り避けてください。
確認方法
- pip install を実行してエラーが消えるか確認します。エラーが続く場合、ファイルパスやPEMの形式(—–BEGIN〜)を確認してください。












