0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

pipを使おうとすると「pip is configured with locations that require TLS/SSL, however the ssl module in Python is not available.」のwarningが出る場合

Posted at

問題

pipを使うと、
pip is configured with locations that require TLS/SSL, however the ssl module in Python is not available.のWargningが出るようになってしまった。
pip installができない。

環境

Mac book Air M2
python は pyenv 経由で使用

$ where python
/Users/ユーザー名/.pyenv/shims/python

どういった時にこのWarningが出るか?

Python が ssl モジュールを正しく認識できていないとき。

  • openssl がシステムにインストールされていても、Python が正しくリンクされていない
  • Python 環境に問題がある
  • OpenSSL の PATH 設定に問題がある

原因:python がシステムの OpenSSL を使っていなかった

# opensslの場所を確認した結果
$ where openssl
/usr/bin/openssl
/opt/homebrew/bin/openssl
/opt/homebrew/opt/openssl/bin/openssl
/usr/bin/openssl
/opt/homebrew/bin/openssl
/opt/homebrew/opt/openssl/bin/openssl
  • pyenv 経由でインストールされた Python は、デフォルトではシステムの OpenSSL とリンクされていない可能性がある
  • /usr/bin/openssl は macOS にプリインストールされている古いバージョンの OpenSSL であるため、これが原因で ssl モジュールが正しく動作していない可能性があった

結果

pyenv を使って Python をインストールした際に、HomebrewのOpenSSLと正しくリンクされるように環境変数を設定し直し、Python を再インストールした。

※OpenSSLは「OpenSSL@3.3」を使用します。記事執筆時点での最新版です。現在のLTSは3.0らしいので、LTSを使う場合は適宜読み替えてください。
参考:https://endoflife.date/openssl

1 . OpenSSL@3.3 をインストール

※すでに openssl@3.3 がインストールされている場合はこのステップはスキップする

$ brew install openssl@3.3

2 . OpenSSL@3.3 のリンク確認

openssl@3.3 を優先的に使うために、次のコマンドでリンクを確認する
このコマンドで openssl@3.3 がデフォルトの OpenSSL として使用されるようになる

$ brew link --force openssl@3.3

3 . 環境変数を .zshrc に追加

openssl@3.3 をデフォルトで使いたい場合、次の環境変数を .zshrc に追加しておくと良い

# OpenSSLパスの設定
export PATH="$(brew --prefix openssl@3.3)/bin:$PATH"
# LDFLAGS と CPPFLAGS の設定
export LDFLAGS="-L$(brew --prefix openssl@3.3)/lib"
export CPPFLAGS="-I$(brew --prefix openssl@3.3)/include"

この設定を反映するには、ターミナルで以下のコマンドを実行する

source ~/.zshrc

4 . pyenv で使用している Python バージョンを確認

$ pyenv versions
pyenv install 3.10.6

5 . Python の再インストール

openssl@3.3 にリンクされた Python を pyenv を使って再インストール
環境変数を設定して、Python をビルドする際に openssl@3.3 を使用させる

$ CFLAGS="-I$(brew --prefix openssl@3.3)/include" \
LDFLAGS="-L$(brew --prefix openssl@3.3)/lib" \
pyenv install <Python_version>
# <Python_version>は上記「pyenv versions」で確認した使っているバージョンを入れる。
# 私の環境だと「pyenv install 3.10.6」となった。

補足:
pyenv を使って Python をインストールする際に、Homebrew でインストールされた OpenSSL のヘッダーファイルとライブラリを Python のビルド時に指定するためのもの。これにより、Python が ssl モジュールを正しく構築し、OpenSSL ライブラリとリンクされるようにしている。

もしpyenv install <Python_version><Python_version> already existsとなる場合は、すでに入っているバージョンであるため、再インストールするには、まず既存の Python バージョンをアンインストールする必要がある

# まず、既にインストールされている Python 3.10.6 をアンインストール 
$ pyenv uninstall 3.10.6
remove .../<Python_version>? [y|N] y
<Python_version> uninstalled

# アンインストール後、openssl@3.3 にリンクして再インストール
$ CFLAGS="-I$(brew --prefix openssl@3.3)/include" \
LDFLAGS="-L$(brew --prefix openssl@3.3)/lib" \
pyenv install 3.10.6

6 . Python が OpenSSL@3.3 とリンクされているか確認

これでエラーが出ず、OpenSSLのバージョンが表示されればOK

$ python -c "import ssl; print(ssl.OPENSSL_VERSION)"
0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?