web-dev-qa-db-ja.com

Windowsのpipで使用されるCAストアにカスタムCAルート証明書を追加する方法は?

Python.orgからPython3をインストールしましたが、pipを含むパッケージのインストールで問題が発生しました。設計上、ネットワーク上の中間者パケット検査アプライアンスは、独自の証明書を使用してすべてのSSL接続に再署名することにより、すべてのパケット(SSLを含む)を検査します。 GPOの一部は、カスタムルート証明書をWindowsキーストアにプッシュします。

Javaを使用しているときに、外部httpsサイトにアクセスする必要がある場合、JVMのcacertsを手動で更新して、自己署名CA証明書を信頼する必要があります。

Pythonでそれを実現するにはどうすればよいですか?現時点では、pipを使用してパッケージをインストールしようとすると、当然、すばらしい[SSL: CERTIFICATE_VERIFY_FAILED]エラーが発生します。

--trusted-Hostパラメーターを使用してそれらを無視できることに気づきましたが、インストールしようとしているすべてのパッケージに対してそれを行いたくありません。

pythonが使用するCA証明書ストアを更新する方法はありますか?

47
Eric B.

自己署名証明書機関pip/conda

Gitで同様の問題を広範囲に文書化した後( gitで自己署名証明書を受け入れるにはどうすればよいですか? )、ここで再びを提供するプロキシを持つ企業ファイアウォールの背後にいますMitMが信頼すべき「攻撃」および:

すべてのSSL検証を無効にしないでください!

これは悪いセキュリティ文化を生み出します。あの人にならないでください。

tl; dr

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を取得できますか?


最新のCAバンドルを入手する

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----

https://support.ssl.com/Knowledgebase/Article/View/19/0/der-vs-crt-vs-cer-vs-pem-certificates-and-how-to-convert-them


自己署名証明書の取得

以下は、自己署名証明書を取得する方法に関するいくつかのオプションです。

  • OpenSSL CLI経由
  • ブラウザ経由
  • Pythonスクリプト経由

OpenSSL CLIによる自己署名証明書の取得

https://unix.stackexchange.com/questions/451207/how-to-trust-self-signed-certificate-in-curl-command-line/468360#46836

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

Pythonを使用して自己署名認証局を取得する

以下のすばらしい回答に感謝します。

Pythonの要求から応答SSL証明書を取得する方法?

さらに一歩踏み出すために、以下をまとめました。

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

参照資料

43
Josh Peak

python -c "import ssl; print(ssl.get_default_verify_paths())"を実行して、証明書の検証に使用される現在のパスを確認します。これらのいずれかに会社のルート証明書を追加します。

パスopenssl_capath_envは、環境変数SSL_CERT_DIRを指します。

SSL_CERT_DIRが存在しない場合は、作成して、ファイルシステム内の有効なフォルダーを指すようにする必要があります。次に、このフォルダに証明書を追加して使用できます。

32
rfkortekaas

ベストアンサーではありませんが、pip--certオプションを使用して、すでに作成されたcaバンドルを再利用できます。たとえば、

pip install SQLAlchemy==1.1.15 --cert="C:\Users\myUser\certificates\my_ca-bundle.crt"
7
aturegano

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 には、構成ファイルに関する詳細情報があります。

3
Alex