pip は常に SSL 検証に失敗します 質問する

pip は常に SSL 検証に失敗します 質問する

Pipは常にSSLに失敗しpip install dedupeますpip install --trusted-host pypi.python.org dedupe

出力はどのような場合でも常に同じです。

重複排除の収集

'SSLError(SSLError(1, '[SSL: CERTIFICATE_VERIFY_FAILED] 証明書の検証に失敗しました (_ssl.c:777)'),)' によって接続が切断された後、再試行しています (再試行 (合計 = 4、接続 = なし、読み取り = なし、リダイレクト = なし、ステータス = なし))。/simple/dedupe/
再試行しています...

スキップ

要件 dedupe を満たすバージョンが見つかりませんでした (バージョン: ) dedupe に一致するディストリビューションが見つかりません

そこで、Anaconda をアンインストールして再インストールしました。結果は同じです。

問題は、私の _ssl.c ファイル (どこにあるかわかりません) が壊れているか何かだと思いますか? とにかく SSL 検証をバイパスするように指示しているのに、なぜ pip がそれを参照する必要があるのでしょうか?

ベストアンサー1

それは、2018年の変更PyPIのドメイン
ファイアウォール/プロキシが以下のアクセスを許可していることを確認してください:

  • pypi.org
  • ファイル.pythonhosted.org

たとえば、次のようなことを試してみてください。

$ python -m pip install--trusted-host files.pythonhosted.org --trusted-host pypi.org --trusted-host pypi.python.org [--proxy ...] [--user]<packagename>

$ pip help installオプションの説明については、を参照してください--user(仮想環境では省略してください)。
この--trusted-hostオプションは実際にはSSL/TLSをバイパスしませんが、有効な(またはまったく)HTTPSがない場合(そしてその場合のみ)ホストを信頼できるものとしてマークすることができます。PiPYでは、pypi.org(旧pypi.python.org)するHTTPSを使用し、その前にCDNがあり、接続するpipクライアントのオプションに関係なく、常にTLSv1.2ハンドシェイク要件を強制します。ただし、HTTPのみのアクセスでpypi.orgのローカルミラーがある場合は--trusted-host便利です。ああ、プロキシの背後にいる場合は、次のことも指定してください。--proxy [user:passwd@]proxyserver:port
一部の企業プロキシでは、交換するHTTPS 接続の証明書をオンザフライで更新します。また、システム クロックが同期していない場合は、SSL 検証プロセスも中断される可能性があります。

ファイアウォール/プロキシ/クロックに問題がない場合は、pipのSSLハンドシェイクで使用されているSSL証明書を確認してください。実際、現在のcacert.pem(MozillaのCAバンドルカール) を実行して、pip オプションを使用して試してください--cert

$ pip --cert ~/cacert.pem install --user <packagename>
ここで、--cert引数は PEM 形式の代替 CA バンドルへのシステム パスです。(--user オプションについては、以下を参照してください)。
または、回避策として、カスタム構成 ~/.pip/pip.conf を作成し、オプションを有効なシステム証明書 (または cacert.pem) にポイントすることもできます。次に例を示します。
[グローバル]
証明書 = /etc/pki/tls/external-roots/ca_bundle.pem
(または別のpemファイル)

pip にある元の cacert.pem を信頼できる CA バンドルに手動で置き換えることも可能です (たとえば、pip が非常に古い場合)。古いバージョンの pip では、証明書の問題が発生した場合に、pip/_vendor/requests/cacert.pem とシステム ストアの間でフォールバックしていました/etc/ssl/certs/ca-certificates.crt/etc/pki/tls/certs/ca-bundle.crt、最近の pip では、pip/_vendor/certifi/cacert.pem のみに依存しているように見えるため、これは当てはまりません。

基本的に、pip パッケージは、SSL 証明書の検証などにrequests使用する which を使用します。これらはすべて、TLS 検証に必要な最新の CA バンドル (cacert.pem ファイル) を提供するパッケージ (pip 9.0.2 以降にも含まれます) とともに、pip 内に同梱 (ベンダー提供) されています。requests 自体は内部で urllib3 と certifi を使用しており、9.0.2 より前では、pip は requests またはシステムからの cacert.pem を使用していました。つまり、OS と pip がかなり前に導入されていた場合は特に、pip を実際に更新すると、CERTIFICATE_VERIFY_FAILED エラーを修正できる可能性があります。urllib3certifi

  • OPはアナコンダを使用していたので、次のことを試すことができました
    $ conda update pip問題が発生する可能性があるcondaとpip両方が同じ環境で使用されている場合。pipのバージョンアップデートが利用できない場合は、以下を試すことができます。
    $ conda config --add channels conda-forge; conda update pip
    あるいは、以下を使用することもできます。コンダPythonパッケージを直接インストール/管理するツールです。pipとは完全に別のツールですが、パッケージとvenvの管理に関しては同様の機能を提供します。パッケージはPyPIからではなく、anaconda 独自のリポジトリ問題は、両方を混ぜて の後にcondaを実行するとpip、前者がpipでインストールされたパッケージ(とその依存関係)を上書きして壊し、すべてが使用できなくなる可能性があることです。そのため、どちらか一方だけを使用する、または、必要に応じて、ピップのみconda (pip の後には conda なし)、および分離された conda 環境でのみ使用できます。

  • condaを使用しない通常のLinux Pythonインストールの場合:
    OSディストリビューションで提供されるpipのバージョンを使用している場合は、システム全体のpip更新のためにベンダー提供のアップグレードを使用してください:
    $ sudo apt-get install python-pipまたは:$ sudo yum install python27-pip
    ディストリビューションは通常PyPIより遅れているため、一部の更新はすぐには利用できない場合があります。この場合、pipをアップグレードすることは可能です。ユーザーレベル(あなたの$ホームdir) または virtualenv 内では、次のようにします。
    $ python -m pip install --user --trusted-host files.pythonhosted.org --trusted-host pypi.org --trusted-host pypi.python.org --upgrade pip
    ( --uservirtualenv 内では省略)
    この--userスイッチは、OS 全体ではなく、現在のユーザー (ホームの ~/.local/lib/) の pip のみをアップグレードします。これは、システムの python パッケージに干渉しないようにするための良い方法です。最近の Ubuntu/Fedora バージョンで配布されている pip では、デフォルトで有効になっています。インポートエラーこのオプションを使わずにOSレベルのシステムpipを上書きしてしまうと、
    代わりに(ユーザーレベルでも)次の方法を試すことができます:
    $ curl -LO https://bootstrap.pypa.io/get-pip.py && python get-pip.py --user
    PyPA脚本pip._vendor.certifi から .pem SSL バンドルを抽出するラッパーが含まれています。

それでもダメなら、-vvv出力に詳細を追加するオプションを付けてpipを実行し、別のSSLError原因があるかどうかを確認してください。tlsv1 アラート プロトコル バージョン

おすすめ記事