web-dev-qa-db-ja.com

Python 3.7.2 pipでパッケージをインストールしようとすると、TLS / SSLエラーが発生する

私は走っています:

Amazon Linux AMI 2018.03.0

Linux ip-xxx-yy-z-ww 4.14.77-70.59.amzn1.x86_64 #1 SMP Mon Nov 12 22:02:45 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux

マルチPython環境。 Python 2.7.15と3.7.2の両方がインストールされています。

通常の(Python2)ピップは問題なく動作します。

pip3 install flaskを実行しようとすると、次のエラーが発生します。

pip is configured with locations that require TLS/SSL, however the ssl module in Python is not available.
Collecting flask
  Retrying (Retry(total=4, connect=None, read=None, redirect=None, status=None)) after connection broken by 'SSLError("Can't connect to HTTPS URL because the SSL module is not available.")': /simple/flask/
  Retrying (Retry(total=3, connect=None, read=None, redirect=None, status=None)) after connection broken by 'SSLError("Can't connect to HTTPS URL because the SSL module is not available.")': /simple/flask/
  Retrying (Retry(total=2, connect=None, read=None, redirect=None, status=None)) after connection broken by 'SSLError("Can't connect to HTTPS URL because the SSL module is not available.")': /simple/flask/
  Retrying (Retry(total=1, connect=None, read=None, redirect=None, status=None)) after connection broken by 'SSLError("Can't connect to HTTPS URL because the SSL module is not available.")': /simple/flask/
  Retrying (Retry(total=0, connect=None, read=None, redirect=None, status=None)) after connection broken by 'SSLError("Can't connect to HTTPS URL because the SSL module is not available.")': /simple/flask/
  Could not fetch URL https://pypi.org/simple/flask/: There was a problem confirming the ssl certificate: HTTPSConnectionPool(Host='pypi.org', port=443): Max retries exceeded with url: /simple/flask/ (Caused by SSLError("Can't connect to HTTPS URL because the SSL module is not available.")) - skipping
  Could not find a version that satisfies the requirement flask (from versions: )
No matching distribution found for flask
pip is configured with locations that require TLS/SSL, however the ssl module in Python is not available.
Could not fetch URL https://pypi.org/simple/pip/: There was a problem confirming the ssl certificate: HTTPSConnectionPool(Host='pypi.org', port=443): Max retries exceeded with url: /simple/pip/ (Caused by SSLError("Can't connect to HTTPS URL because the SSL module is not available.")) - skipping

他のパッケージをインストールしようとすると、同じエラーが表示されます。

pip3バージョンは18.1です

--trusted-Host pypi.orgを追加しても効果はありません。

CA証明書をインストールしても役に立たなかった

次のガイドに従ってインストールされたPython 3: https://stackoverflow.com/a/8112006/8826349

編集:私は今気付いた、makeをPython 3で実行すると、正常に終了しましたが、次のメッセージが表示されていました。

Python build finished successfully!
The necessary bits to build these optional modules were not found:
_hashlib              _ssl                  _tkinter
_uuid
To find the necessary bits, look in setup.py in detect_modules() for the module's name.


The following modules found by detect_modules() in setup.py, have been
built by the Makefile instead, as configured by the Setup files:
_abc                  atexit                pwd
time


Could not build the ssl module!
Python requires an OpenSSL 1.0.2 or 1.1 compatible libssl with X509_VERIFY_PARAM_set1_Host().
LibreSSL 2.6.4 and earlier do not provide the necessary APIs, https://github.com/libressl-portable/portable/issues/381

EDIT2:

私の問題は this と同じようです。ただし、スレッドは問題の説明以外に解決策を提供しません。

this ガイドを使用して、opensslの新しいバージョンをコンパイルしようとしました。しかし、opensslの新しいバージョンでは問題が解決しませんでした。

EDIT3:

この問題の解決策を見つけることができませんでした。

AmazonのLinuxバージョンはPython 3。

Amazon Linux 2と呼ばれる別のOSがあり、Python 3のインストールはyum install python3の実行と同じくらい簡単です。

ただし、Amazon Linux 2には独自の問題があります。 Python 2インストールにはpipがありません。次のコマンドを実行して手動でインストールできます。

curl -O https://bootstrap.pypa.io/get-pip.py
python get-pip.py --user

しかし、これは実際にはpip3をオーバーライドするため、Python 3はpipなしで残ります。

8
AlexM

したがって、このコンテキストのSSLError( "SSLモジュールが利用できないためHTTPS URLに接続できません。")は、ソースからpython3.7をコンパイルしたときに、システムのOpenSSLライブラリに対してリンクされなかったことを示しています。徹底的な解決策は、次のようなものを使用して、libのほかに必要なヘッダーがあることを確認することです。
$ yum install openssl-devel.x86_64 openssl.x86_64
そしてOpenSSL libに対してリンクして、ゼロから再コンパイルします。

ただし、ご指摘のとおり、python3をyum(Amazon独自のリポジトリから、Amazon Linux用にテストされたパッケージから)でインストールする方が、EC2ではるかに簡単で堅牢なアプローチであり、すべての依存関係が解決されます。たとえば、次のようなものがAmazon Linux(バージョン1)で機能します。

$ yum install python36.x86_64
$ yum install python36-pip.noarch

通常、Python3.6はすでにEC2にプリインストールされていますが、python36-pipはプリインストールされていません...

これは、Python3のpipスクリプトがpip3コマンドによって呼び出される、正しいデフォルトの動作です。一方、pipはPython2用です(インストールされている場合-python2のyumパッケージはpython27-pip.noarchです)。次に例を示します。

$ pip3 -V  
pip 9.0.1 from /usr/local/lib/python3.6/site-packages (python 3.6)  
$ pip2 -V  
pip 9.0.1 from /usr/local/lib/python2.7/site-packages (python 2.7)  
$ pip -V  
pip 9.0.1 from /usr/local/lib/python2.7/site-packages (python 2.7)  

バージョン化されたPythonコマンドを-mスイッチ(モジュール用)と組み合わせて使用​​して、対応するバージョンのpipを実行することもできます。次に例を示します。
$ python3 -m pip install --user flask

get-pip.py --userを介してインストールしたものは、$ HOME/.local/binディレクトリのどこかにある可能性があります。 --userスイッチは、システム全体ではなく現在のユーザー(〜/ .local/lib /内)のみにパッケージをインストールします。これは、システムへの干渉を回避するための実際の方法ですpythonパッケージ。

さらに優れた点として、virtualenvまたはvenv分離環境内でpipを使用できます。python36-virtualenv(yumを介してインストール可能)と、デフォルトの 'venv'モジュールが組み込まれたPython3であり、すぐに利用できます(python3 -m venv yournewenvname)。分離したpython環境(ディレクトリ))を作成してアクティブ化したら、pythonバージョンに関係なく、そこで簡単なpip install flaskを実行できます。幸運を!

3
Alex C.

Sslエラーを無視するか、open-sslをインストールできます。 this を試してみてください。

0