はじめに
この記事の目的
Pythonで「ssl module is not available」というエラーに遭遇すると、インターネットに接続する処理やパッケージのインストールが止まってしまいます。本記事は、そのエラーの概要と、発生しやすい状況、原因、具体的な対処法までを分かりやすく解説します。初心者の方でも手順を追って直せるように丁寧に説明します。
対象読者
- Pythonでネットワークやパッケージ管理を使う方
- 自分でPythonをビルドしたり、環境を構築している方
- エラーの原因を調べたい方
本記事の構成と使い方
以下の章立てで進めます。必要な章だけ読み飛ばしても問題ありません。
– 第2章: エラーの原因と対処法(概要)
– 第3章: 発生しやすいケースの紹介
– 第4章: よく見るエラーメッセージ例
– 第5章: 原因の詳細(技術的説明)
– 第6章: 対処方法と手順(実践)
– 第7章: トラブルシューティングの注意点
– 第8章: 関連情報と参考事例
記事を読み進める際は、ご自身の環境(OS、Pythonの入手方法、使っているツール)を把握しておくと、該当箇所をすばやく見つけられます。次の章から具体的に見ていきましょう。
Pythonで「ssl module is not available」エラーが発生した場合の原因と対処法
概要
Pythonでpipやrequestsを使う際に「ssl module is not available」や「_ssl module is not available」といったエラーが出ることがあります。これは標準のsslモジュールが動作していないためで、HTTPS通信ができなくなります。
主な原因
- OpenSSLや開発用ヘッダがインストールされていない
- 独自にビルドしたPythonがOpenSSLとリンクできていない
- pyenvやAnaconda環境で依存ライブラリが不足している
確認手順(簡単)
- Pythonで確認: python -c “import ssl; print(ssl.OPENSSL_VERSION)”
- エラーなら、ビルド時のログやlddで_sslモジュールを確認します。
簡単な対処法
- システムにOpenSSLとその開発パッケージを入れる(例: Ubuntuならlibssl-dev)
- pyenvなら依存を整えてから再インストールする(環境変数でOpenSSLの場所を指定する場合あり)
- Anacondaならconda install opensslを試す
具体例(よくあるケース)
- Ubuntu: sudo apt install libssl-dev libffi-dev build-essential
- macOS(Homebrew): brew install openssl してから、pyenvで再ビルド時にLDFLAGS/CPPFLAGSを設定
- Anaconda: condaでopensslを更新後、環境を再作成すると早く解決する場合が多いです。
注意点
Pythonを再ビルドする前に必ず依存を入れてください。環境を壊さないために、作業前に仮想環境やバックアップを用意すると安心です。
エラー発生時のよくあるケース
1) pyenvやソースからPythonをビルドしたとき
- 症状: Pythonでsslモジュールが見つからずエラーになる。pipやrequestsが動かない。
- 背景: ビルド時にOpenSSLの開発用ライブラリ(ヘッダや.so)が無いと、sslモジュールがコンパイルされません。
- 確認例: pythonで「import ssl」が失敗するか確認します。失敗すれば依存が欠けています。
- 対処のヒント: OSに応じてlibssl-devやopenssl-devel、またはAlpineならopenssl-devを入れてから再ビルドします。
2) DockerやUnraidなどの軽量イメージで依存が不足しているとき
- 症状: コンテナ内でsslモジュールが無効、アプリが外部HTTPSに接続できない。
- 背景: 最小イメージはサイズを小さくするため多くの開発パッケージを省きます。特にAlpineはmusl系で追加パッケージが必要です。
- 確認例: イメージのベースがalpineやscratchか確認し、openssl関連パッケージの有無を調べます。
- 対処のヒント: Dockerfileで必要なパッケージを追加してイメージを再ビルドします(例: aptでlibssl-dev、apkでopenssl-devなど)。
3) Splunkなど特殊なラッパー環境で標準モジュールが正しく読み込まれないとき
- 症状: 他の環境では動くコードが、Splunkや組み込みのPythonでssl読み込みに失敗する。
- 背景: 組み込み環境は独自のPython実装やパス設定を使うため、標準モジュールが見つからない場合があります。
- 確認例: sys.pathやPython実行ファイルの位置を確認し、環境が独自に提供するライブラリを調べます。
- 対処のヒント: 環境のドキュメントを参照し、必要ならフルPythonバイナリや適切なモジュールを配置します。また仮想環境を使って動作検証します。
主なエラーメッセージ例
Pythonでsslモジュールが使えないとき、よく出るエラーメッセージと意味をわかりやすくまとめます。
代表的なメッセージ(そのままの文言例)
- WARNING: pip is configured with locations that require TLS/SSL, however the ssl module in Python is not available.
-
pipがHTTPSでのやり取りを期待しているが、Python側でsslが利用できないことを警告します。
-
SSLError(“Can’t connect to HTTPS URL because the SSL module is not available.”)
-
requestsやurllib3などがHTTPS接続を試みた際に、sslモジュールが無いため接続できないことを示します。
-
Could not fetch URL https://pypi.org/simple/requests/: There was a problem confirming the ssl certificate…
-
pipがPyPIへ接続できず、証明書の確認ができないためパッケージを取得できないことを示します。
-
ImportError: No module named ‘_ssl’ または ModuleNotFoundError: No module named ‘_ssl’
- Pythonの内部でsslを提供する拡張モジュールが見つからないことを直接示します。
見かけたときにまず確認すること
- 上の文言が含まれていれば、HTTPS通信に必要なssl機能が無効か欠けています。
- pipやrequestsから出るエラーか、Pythonのimport時に出るかで原因の切り分けができます。
これらのメッセージは、問題の手がかりになります。次章で原因の詳細を説明します。
原因の詳細
Pythonでsslモジュールが利用できない主な理由を、分かりやすく整理します。具体例を交えながら説明しますので、自分の環境と照らし合わせてください。
ビルド時にOpenSSLが見つからなかった
Pythonをソースからビルドするとき、ビルドスクリプトはOpenSSLのヘッダやライブラリを探してssl拡張を組み込みます。これらが見つからないと、sslモジュール自体が生成されません。例:Ubuntuでlibssl-devを入れずにconfigure→makeした場合、_ssl.soが作られません。
OSの開発ヘッダやパッケージが未インストール
多くの配布では”開発用ヘッダ”が別パッケージです。Debian/Ubuntuならlibssl-dev、CentOS/RHELならopenssl-devel、macOSならHomebrewでopenssl/openssl@3を入れてビルド時に参照する必要があります。パッケージ名が異なる点に注意してください。
ランタイムのOpenSSLとPythonの不整合
システムに複数のOpenSSLがあると、リンク先が期待と違う場合があります。古いOpenSSLや非推奨のバージョンにリンクされると、モジュールが正しく動かないことがあります。pyenvや自前ビルド時にカスタムパスを指定し忘れる例が多いです。
特殊な実行環境での問題(例:Splunk)
Splunkや組み込みアプリのように独自のPythonランタイムを使う環境では、標準モジュールが正しく配備されない場合があります。環境変数やPYTHONPATHで標準ライブラリが上書きされ、sslがロードされないことがあります。
ヘッダやライブラリの配置・権限の問題
ヘッダはあるがライブラリが見つからない、またはシンボリックリンクが欠けている場合もあります。ビルド時に指定したライブラリパス(LD_LIBRARY_PATHや–with-openssl)を確認してください。
次章では、ここで挙げた原因に対する具体的な対処方法を順を追って説明します。
対処方法・解決策
まずはOpenSSLの開発パッケージをインストールします。多くの場合、これで問題が解決します。
- Ubuntu / Debian系
sudo apt-get update
とsudo apt-get install libssl-dev
を実行します。- RHEL / CentOS系
sudo yum install openssl-devel
を実行します。- macOS(Homebrew使用)
brew install openssl@1.1
またはbrew install openssl
を実行し、次の環境変数を設定します。export LDFLAGS="-L$(brew --prefix openssl)/lib"
export CPPFLAGS="-I$(brew --prefix openssl)/include"
export PKG_CONFIG_PATH="$(brew --prefix openssl)/lib/pkgconfig"
パッケージを入れた後は、Python本体を再ビルドまたは再インストールしてください。pyenvでインストールした場合は、上記の環境変数を設定した状態で pyenv install <version>
を実行します。システムのソースからビルドする場合も同様にOpenSSLのパスを指定して再ビルドします。
特殊環境では公式の実行方法を使います。たとえばSplunkなどの組み込みPythonでは splunk cmd python script.py
のように、製品が推奨するコマンドで実行してください。
動作確認は python -c "import ssl; print(ssl.OPENSSL_VERSION)"
で行います。出力が正しく表示されれば解決です。上記で解決しない場合は、インストールしたOpenSSLの場所やPythonビルド時のログを確認すると原因特定が早くなります。
トラブルシューティングのポイント
まず確認すること
- Pythonでimport sslが動くかを確かめます。具体的には端末で次を実行してください。
- python -c “import ssl; print(getattr(ssl,’OPENSSL_VERSION’, ‘no ssl’))”
- エラーが出る、または”no ssl”が返るならsslモジュールが組み込まれていません。
python -m sslで詳しいエラーを確認
- python -m sslを実行すると、組み込み時のエラーが表示されることがあります。表示されたメッセージを手掛かりにします。
ビルドログを確認する
- ソースからPythonをビルドした場合は、ビルドログにOpenSSL関連の警告(例: “OpenSSL not found”、”_ssl failed” など)がないか探します。
- パッケージ管理でインストールした場合も、インストール時のログやメッセージを確認してください。
pipやHTTPSでの失敗を手がかりにする
- pip installの実行時にSSLや証明書のエラーが出る場合、Pythonにsslが適切に組み込まれていない可能性があります。
- 例: pipでHTTPS接続ができずエラーになる場合、まずimport sslの確認を優先します。
よくある原因と簡単な対処例
- 開発用のOpenSSLヘッダやライブラリが不足している(Ubuntu: libssl-dev、CentOS: openssl-devel をインストール)
- macOSではHomebrewのopensslを利用してビルドオプションを指定する必要があります
- 既存のPythonを再ビルドまたは公式バイナリを使うことで解決することが多いです
最後に確認すること
- import sslが成功したら、python -c “import ssl; print(ssl.OPENSSL_VERSION)”でOpenSSLバージョンを確認してください。環境を変えた場合は仮想環境やPATHの影響も確認します。こうした手順で原因を絞り込めます。
関連情報・参考事例
この記事では、実際に報告された3つの事例を紹介し、原因と実践的な対処法を分かりやすく示します。
ケース1: Unraid OS 7.0(Python3/pipでSSLエラー)
- 症状: pipやPythonでsslモジュールが使えずHTTPS接続が失敗する。
- 考えられる原因: PythonがOpenSSLヘッダーやライブラリ無しでビルドされた。Unraid 6.12では同梱ライブラリが異なり問題が出なかった。
- 対処例: OpenSSLの開発パッケージを導入するか、OpenSSLを含むプリビルトのPythonを使う。まず
- python -c “import ssl; print(getattr(ssl,’OPENSSL_VERSION’, ‘no’))” で確認
- 必要ならDockerコンテナやプラグインでOpenSSL入りの環境に切替える。
ケース2: macOS 14.3 (M3)/pyenvでuniversal版インストール
- 症状: pyenvでインストールしたuniversalビルドのPythonでsslが使えない。
- 考えられる原因: Homebrewのopensslが参照されておらず、ビルド時にリンクされていない。
- 対処例: brew install openssl@3 してから、環境変数を設定して再ビルドします。
- export LDFLAGS=”-L$(brew –prefix openssl@3)/lib”
- export CPPFLAGS=”-I$(brew –prefix openssl@3)/include”
- pyenv install
ケース3: Splunk環境でコマンド実行方法により差がある
- 症状: Splunkの内部コマンドではsslが使えないが、シェルのpythonでは動く。
- 考えられる原因: Splunkが同梱のPythonや独自の環境変数を使い、システムのOpenSSLを参照していない。
- 対処例: Splunkのドキュメントに従い、必要な証明書やopensslをSplunkが参照する場所へ配置するか、外部で処理して結果を渡す。
各ケースとも、まずは「python -c ‘import ssl; print(ssl.OPENSSL_VERSION)’」で現状を確認してください。ログやビルドログを保存しておくと、原因特定が早くなります。必要なら、環境情報(OS版、Pythonビルド方法、使用したコマンド)を添えて相談してください。