urllib3 v2.0 と LibreSSL の互換性エラーの解決策
問題の説明
Python 環境で import openai
や import requests
を実行した際に、次のエラーが発生する場合があります:
python
ImportError: urllib3 v2.0 only supports OpenSSL 1.1.1+, currently the 'ssl' module is compiled with LibreSSL 2.8.3
この問題は、以下の条件が重なった際に発生します:
urllib3
のバージョンが v2.0 以上- Python の
ssl
モジュールが LibreSSL でコンパイルされている - システムの OpenSSL バージョンが古い(1.1.1 未満)
エラーが発生する典型的なシナリオ
none
pip install openai
python -c "import openai"
# エラーが発生
エラーの根本原因
urllib3 v2.0
は OpenSSL 1.1.1 以降の機能に依存していますが、多くの macOS 環境ではデフォルトで LibreSSL が使用されています。バージョンの不一致によりこのエラーが発生します。
重要な注意点
この問題は macOS のデフォルト Python 環境で頻発しますが、Linux や Windows でも同様の環境条件で発生する可能性があります。
推奨解決策
方法 1: urllib3 のバージョンダウングレード(簡単・即効性あり)
最も安全で簡単な解決策です。互換性のある urllib3 の旧バージョンをインストールします:
bash
pip uninstall urllib3
pip install 'urllib3<2.0'
特定バージョンのインストール例
bash
# 動作確認バージョンの例
pip install urllib3==1.26.6
方法 2: Python バージョンのアップグレード(根本的解決)
Python 3.12 以降では OpenSSL の互換性が改善されています:
bash
# Homebrew を使用して最新 Python をインストール(macOS)
brew install python@3.12
# 仮想環境の再作成
python3.12 -m venv myenv
source myenv/bin/activate
# パッケージの再インストール
pip install -r requirements.txt
方法 3: OpenSSL の手動アップグレード(上級者向け)
システムの OpenSSL をアップグレードし、Python を再構築します:
bash
# OpenSSL 1.1.1 のインストール
brew install openssl@1.1
# Python の再インストール(pyenv 使用例)
CONFIGURE_OPTS="--with-openssl=$(brew --prefix openssl@1.1)" pyenv install 3.9.16
# SSL バージョンの確認
python -c "import ssl; print(ssl.OPENSSL_VERSION)"
# OpenSSL 1.1.1 が表示されれば成功
補足的な回避策(非推奨)
警告のみ表示される場合の一時的な回避方法(根本解決ではありません):
python
import warnings
warnings.filterwarnings("ignore", message=r".*urllib3 v2.*only supports OpenSSL.*")
警告無視の注意
この方法はエラーメッセージを表示させなくするだけで、根本的なセキュリティ問題を解決しません。恒久対策として推奨されません。
原因の技術的背景
- urllib3 v2.0 は OpenSSL 1.1.1+ 必須(公式リリースノート)
- macOS デフォルト Python は LibreSSL でビルドされることが多い
- OpenSSL 1.1.0以下 では新機能 (TLS 1.3 等) がサポートされない
正常な環境の確認方法
python
import ssl
print(ssl.OPENSSL_VERSION_INFO) # OpenSSL 1.1.1+ なら正常
根本解決のための推奨アプローチ
- 最新 Python への移行(3.12+)
- システム OpenSSL の更新
- プロジェクトごとに仮想環境を使用
pip list
でurllib3
バージョンを定期的に確認
本番環境では、urllib3 のバージョンピンニングを厳密に行うことをお勧めします:
txt
# requirements.txt での例
urllib3~=1.26.6