Windowsのpipで使用されるCAストアにカスタムCAルート証明書を追加するにはどうすればよいですか?


85

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

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

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

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

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


5
@rfkortekaasこれらのオプションはすべて、プロセスに新しいものを追加することを含みます。Pythonは、システムのどこかに保存されているデフォルトのトラストストアを利用する必要があります。そのトラストストアを変更したいのですが。変数や別のcaストアなどを追加したくありません。Javaでは、jvmは(OSとは別の)独自のトラストストアに依存しています。ルート証明書はWindowsストアにあり、Pythonによって認識されないため、Pythonは同様のことをしているに違いないと思います。
エリックB.

回答:


98

自己署名認証局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は、MozillaFirefoxにバンドルされている認証局の抜粋を公開しています

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


自己署名証明書の取得

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

  • OpenSSLCLI経由
  • ブラウザ経由
  • Pythonスクリプティング経由

OpenSSLCLIで自己署名証明書を取得する

/unix/451207/how-to-trust-self-signed-certificate-in-curl-command-line/468360#468360

echo quit | openssl s_client -showcerts -servername "curl.haxx.se" -connect curl.haxx.se:443 > cacert.pem

ブラウザを介して自己署名認証局を取得する

この回答とリンクされたブログのおかげで、証明書を表示し、base64PEMエンコーディングオプションを使用してファイルにコピーする方法(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


最終的に

このCAストアが追加の自己署名CAとともにどこにあるかがわかるように、pipとcondaで構成を設定します。

pip config set global.cert %USERPROFILE%\certs\ca-bundle.crt
conda config --set ssl_verify %USERPROFILE%\certs\ca-bundle.crt

または

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

# Hot tip: use -v to show where your pip config file is...
pip config list -v
# Example output for macOS and homebrew installed python
For variant 'global', will try loading '/Library/Application Support/pip/pip.conf'
For variant 'user', will try loading '/Users/jpeak/.pip/pip.conf'
For variant 'user', will try loading '/Users/jpeak/.config/pip/pip.conf'
For variant 'site', will try loading '/usr/local/Cellar/python/3.7.4/Frameworks/Python.framework/Versions/3.7/pip.conf'

参考文献


6
すべての時間の最も偉大な答えの一つ
ケビン・パウリ

pip config set global.trusted-host XXXXX.com
zzzzzzzz19年

Windowsでは、証明書に.pem形式を使用すると機能します。
ダニエルアルグエレス

1
@DanielArgüellesええそうです。ほとんどの場合、認証局バンドルをマージしなくても問題は解決しますが、pipまたはcondaが他のサーバーの証明書を検証できるように、完全なバンドルが必要になることは十分にあります。最終的に、バンドルはまだ多くのpemファイルの内容を含むテキストファイルです。それが機能し、検証を無効にする必要がなかったことをうれしく思います!:D
ジョシュピーク

42

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

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

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


11
私のWindowsシステムでは、これは「/ usr / local / ssl / certs」を返しますが、これはWindowsでは使用できません。
Colin Talbert 2016

1
別のプロジェクトにヤンクされた後、私はついにこれを行うことに取り掛かりました。@ ColinTalbertと同様に、存在しないフォルダーを指します/usr/local/ssl/certs
エリックB.

私は私の質問を編集しました、そしてうまくいけばこれはケースを解決します。
rfkortekaas 2016

1
@rfkortekaasSSL_CERT_FILEまたはSSL_CERT_DIR変数の更新が機能しませんでした。PEMファイルを更新する方法の問題ではなく、Pythonにcygwin / Windowsの正しいパスにアクセスさせる方法の問題である可能性があるため、この問題に対して新しいSOの質問を作成しました。
エリックB.

1
私は試した。~/.config/pip/pip.conf必要な設定でpip.confファイルを作成することになりました。 この回答を参照してください
エリックB.

7

最善の答えではありません--certpip、たとえば次のオプションを使用して、作成済みのCAバンドルを再利用できます。

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

4

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


こんにちはアレックス、どうやって証明書へのパスをpip.iniファイルに「入れた」のですか?コマンドラインから?メモ帳などにファイルパスを入力して、テキストファイルとして保存しましたか?私はanacondaプロンプトを使用していますが、Windowsに似ていると思います。
spacedustpi 2018

メモ帳でテキストファイルを作成し、ファイル拡張子を「txt」から「ini」に変更しました。
アレックス

ああ。はい。パスの上に「[gobal]」と入力する必要がありますか?この種のチュートリアルのためにどこに行けばいいか知っていますか?ありがとう。
spacedustpi 2018

はい、「[グローバル]」も入力する必要があります。申し訳ありませんが、チュートリアルはわかりませんが、pip.pypa.io / en / stable / user_guide /#configurationに詳細があります。
アレックス

おかげで、私はそれを両方の方法で試しました、そしてはい、「[グローバル]」は傷つきません。
spacedustpi 2018

1

Windowsでの代替ソリューションは、PythonがWindows証明書ストアを使用できるようにするpython-certifi-win32をインストールすることです。

pip install python-certifi-win32

0

nt86のソリューションは、基盤となるWindowsインフラストラクチャ(証明書ストア)を活用しているため、最も適切だと思います。ただし、pipは機能しないため、最初にpython-certifi-win32をインストールする方法については説明していません。

秘訣は、を使用--trustedhostしてpython-certifi-win32をインストールすることです。その後、pipは自動的にWindows証明書ストアを使用して、プロキシが使用する証明書をロードします。

つまり、一言で言えば、次のことを行う必要があります。

pip install python-certifi-win32 -trustedhost pypi.org

その後、あなたは行ってもいいはずです


-1

AnacondaNavigatorを開きます。

File \ Preferencesに移動します。

SSL検証を有効にする無効にする(非推奨)

またはSSL証明書パスを有効にして指定します(オプション)

パッケージを特定のバージョンに更新します。

[右上にインストール]を選択します

パッケージを選択し、チェックマークをクリックします

更新用にマーク

特定のバージョンのインストール用にマーク

[適用]をクリックします

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.