Python.orgからPython3をインストールしましたが、pip
を含むパッケージのインストールで問題が発生しました。設計上、ネットワーク上の中間者パケット検査アプライアンスは、独自の証明書を使用してすべてのSSL接続に再署名することにより、すべてのパケット(SSLを含む)を検査します。 GPOの一部は、カスタムルート証明書をWindowsキーストアにプッシュします。
Javaを使用しているときに、外部httpsサイトにアクセスする必要がある場合、JVMのcacertsを手動で更新して、自己署名CA証明書を信頼する必要があります。
Pythonでそれを実現するにはどうすればよいですか?現時点では、pip
を使用してパッケージをインストールしようとすると、当然、すばらしい[SSL: CERTIFICATE_VERIFY_FAILED]
エラーが発生します。
--trusted-Host
パラメーターを使用してそれらを無視できることに気づきましたが、インストールしようとしているすべてのパッケージに対してそれを行いたくありません。
pythonが使用するCA証明書ストアを更新する方法はありますか?
pip
/conda
Gitで同様の問題を広範囲に文書化した後( gitで自己署名証明書を受け入れるにはどうすればよいですか? )、ここで再びを提供するプロキシを持つ企業ファイアウォールの背後にいますMitMが信頼すべき「攻撃」および:
すべてのSSL検証を無効にしないでください!
これは悪いセキュリティ文化を生み出します。あの人にならないでください。
pip config set global.cert path/to/ca-bundle.crt
pip config list
conda config --set ssl_verify path/to/ca-bundle.crt
conda config --show ssl_verify
# Bonus while we are here...
git config --global http.sslVerify true
git config --global http.sslCAInfo path/to/ca-bundle.crt
しかし、どこでca-bundle.crt
を取得できますか?
cURLは、Mozilla Firefoxにバンドルされている認証局の抜粋を公開しています
https://curl.haxx.se/docs/caextract.html
このcacert.pem
ファイルをテキストエディターで開くことをお勧めします。このファイルに自己署名CAを追加する必要があるためです。
証明書はX.509に準拠したドキュメントですが、いくつかの方法でディスクにエンコードできます。以下の記事は良い読み物ですが、短いバージョンでは、ファイル拡張子でPEMと呼ばれることが多いbase64エンコーディングを扱っています。次の形式が表示されます。
----BEGIN CERTIFICATE----
....
base64 encoded binary data
....
----END CERTIFICATE----
以下は、自己署名証明書を取得する方法に関するいくつかのオプションです。
echo quit | openssl s_client -showcerts -servername "curl.haxx.se" -connect curl.haxx.se:443 > cacert.pem
この回答とリンクされたブログのおかげで、証明書を表示し、base64 PEMエンコードオプションを使用してファイルにコピーする方法(Windows)の手順を示しています。
このエクスポートされたファイルの内容をコピーし、cacerts.pem
ファイルの最後に貼り付けます。
一貫性を保つために、このファイルの名前をcacerts.pem
-> ca-bundle.crt
に変更し、次のように簡単な場所に配置します。
# Windows
%USERPROFILE%\certs\ca-bundle.crt
# or *nix
$HOME/certs/cabundle.crt
以下のすばらしい回答に感謝します。
さらに一歩踏み出すために、以下をまとめました。
https://github.com/neozenith/get-ca-py
Pipおよびcondaで構成を設定して、このCAストアがどこにあるかを、追加の自己署名CAとともに認識できるようにします。
pip config set global.cert %USERPROFILE%\certs\ca-bundle.crt
conda config --set ssl_verify %USERPROFILE%\certs\ca-bundle.crt
OR
pip config set global.cert $HOME/certs/ca-bundle.crt
conda config --set ssl_verify $HOME/certs/ca-bundle.crt
その後
pip config list
conda config --show ssl_verify
python -c "import ssl; print(ssl.get_default_verify_paths())"
を実行して、証明書の検証に使用される現在のパスを確認します。これらのいずれかに会社のルート証明書を追加します。
パスopenssl_capath_env
は、環境変数SSL_CERT_DIR
を指します。
SSL_CERT_DIR
が存在しない場合は、作成して、ファイルシステム内の有効なフォルダーを指すようにする必要があります。次に、このフォルダに証明書を追加して使用できます。
ベストアンサーではありませんが、pip
の--cert
オプションを使用して、すでに作成されたcaバンドルを再利用できます。たとえば、
pip install SQLAlchemy==1.1.15 --cert="C:\Users\myUser\certificates\my_ca-bundle.crt"
Windowsでは、%APPDATA%\ pip \にpip.iniファイルを作成して解決しました
例えばC:\ Users\asmith\AppData\Roaming\pip\pip.ini
Pip.iniで、証明書へのパスを入力します。
[global]
cert=C:\Users\asmith\SSL\teco-ca.crt
https://pip.pypa.io/en/stable/user_guide/#configuration には、構成ファイルに関する詳細情報があります。