web-dev-qa-db-ja.com

Python Mac OS TrustStoreのCA証明書を使用する方法は?

会社のイントラネットでcurtomルート証明書を使用する必要があり、それらをMac OS TrustStore(KeyChain)にロードすると、すべてのブラウザーおよびGUIアプリの問題が解決されます。

Mac OS Xに同梱されているcurlのバージョンでも動作するようですが、pythonでは動作しません。 Mac OS 10.12 Sierra(Python 2.7.10)に同梱されているバージョン

それでも、それは私がヒットするようです:

urllib2.URLError: <urlopen error [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:590)>

どうすれば解決できますか?

多くのPythonツールでこの問題に遭遇するので、パッチを適用せずにそれを回避する方法を見つけていただければ幸いです。

数十のPython使用しているツールにパッチを当てることができないため、自分でカスタムCA証明書を提供することは選択肢ではありません。

ほとんどのツールはrequestsライブラリを使用していますが、Pythonで直接、ネイティブSSLサポートを使用しているものがいくつかあります。

32
sorin

追加の証明書をPEMバンドルファイルに入れる場合、これら2つの環境変数を使用して、Python openssl and requests。で使用されるデフォルトの証明書ストアを上書きできます。

SSL_CERT_FILE=/System/Library/OpenSSL/cert.pem
REQUESTS_CA_BUNDLE=/System/Library/OpenSSL/cert.pem

このファイルは存在しないため、自分で作成する必要があることに注意してください。

6
sorin

これはPython 3.6 with MacOS Sierrraでも問題です。使用ケースが異なることは知っています。しかし、この問題を調査中にこのスレッドにつまずきました。チェックアウト:

http://www.cdotson.com/2017/01/sslerror-with-python-3-6-x-on-macos-sierra/

一言で言えば:Python 3.6はMacOSのopenSSLに依存しなくなりました。独自のopenSSLがバンドルされ、 MacOSのルート証明書にはアクセスできません。

次の2つのオプションがあります。

Python 3.6に同梱されているインストールコマンドを実行する

cd /Applications/Python\ 3.6/
./Install\ Certificates.command

または

certifiパッケージをインストールします

pip install certifi

最初のオプションを選択しましたが、うまくいきました。

39
j7nn7k

更新とデータポイントとして、私はこの問題に遭遇しましたPython 3.7.0 on macOS 10.13.4:

$ ipython
Python 3.7.0 (v3.7.0:1bf9cc5093, Jun 26 2018, 23:26:24)
Type 'copyright', 'credits' or 'license' for more information
IPython 7.0.1 -- An enhanced Interactive Python. Type '?' for help.

In [1]: import bokeh.sampledata

In [2]: bokeh.sampledata.download()
Using data directory: /Users/me/.bokeh/data

...
SSLCertVerificationError: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate (_ssl.c:1045)

問題を解決するための手順は/Applications/Python\ 3.7/ReadMe.rtf

そこでの提案に従い、/Applications/Python\ 3.7/Install\ Certificates.command 問題を解決しました:

ターミナルから:

$ /Applications/Python\ 3.7/Install\ Certificates.command

IPythonを再起動しています...

$ ipython
>>> import bokeh.sampledata

>>> bokeh.sampledata.download()
Using data directory: /Users/me/.bokeh/data
Downloading: CGM.csv (1589982 bytes)
   1589982 [100.00%]
...
3
JS.

Mac brew install python env。

$ python3
Python 3.7.3 (v3.7.3:ef4ec6ed12, Mar 25 2019, 16:52:21) 
[Clang 6.0 (clang-600.0.57)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import certifi
>>> certifi.where()
'/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/certifi/cacert.pem'
>>> 

または、コマンドラインから:

$ python -m certifi

次に、cert.pemとしてリンクcacert.pemが必要です

$ ln -s /Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/certifi/cacert.pem cert.pem
$ pwd
/Library/Frameworks/Python.framework/Versions/3.7/etc/openssl

rehash

その後、正常に動作します。

1
luckrill

私のために /Applications/Python\ 3.6/./Install\ Certificatesコマンドは、pip certifiインストールで失敗します。私はMac High Sierraでpython3を使用しているため、pipは多少失敗し、代わりにpip3を使用する必要があります。

だからここで私がやったこと:

  1. 手動で実行pip3 install --update certifyシェルで
  2. コマンドスクリプトからインストール証明書行を削除します
  3. スクリプトを再実行すると、すべてがうまくいきました。

次の場所にcert.pemシンボリックリンクが作成されることに注意してください:/Library/Frameworks/Python.framework/Versions/3.6/etc/openssl/

0
Rocko

これを実行して、適切な変数を設定します。これは、ここですでに与えられている答えの組み合わせです。 〜/ .bash_profileに入れて永続化します。

CERT_PATH=$(python -m certifi)
export SSL_CERT_FILE=${CERT_PATH}
export REQUESTS_CA_BUNDLE=${CERT_PATH}
0
Hitesh Patel