webentwicklung-frage-antwort-db.com.de

Wie kann ich Python dazu bringen, CA-Zertifikate von Mac OS TrustStore zu verwenden?

Ich muss Curtom-Root-Zertifikate im Intranet des Unternehmens verwenden, und das Laden im Mac OS TrustStore (KeyChain) löst das Problem für alle Browser und GUI-Apps.

Es scheint, dass es auch mit der Version von curl funktioniert, die mit Mac OS X ausgeliefert wird, aber funktioniert nicht mit Python;

Dennoch scheint es, dass ich von folgenden Leuten getroffen würde:

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

Wie kann ich das lösen?

Da mir dieses Problem in vielen, vielen Python-Tools begegnet, würde ich mich sehr freuen, wenn ich einen Weg finde, um es zu vermeiden, ohne sie zu patchen.

Die Bereitstellung des benutzerdefinierten CA-Zertifikats selbst ist keine Option, da ich nicht mehrere der von mir verwendeten Python-Tools patchen kann. 

Die meisten Tools verwenden die requests-Bibliothek, aber einige verwenden die systemeigene SSL-Unterstützung direkt in Python.

21
sorin

Wenn Sie die zusätzlichen Zertifikate in eine PEM-Bundle-Datei einfügen, können Sie diese beiden Umgebungsvariablen verwenden, um die von Python openssl und Anforderungen verwendeten Standardzertifikate zu überschreiben.

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

Bitte beachten Sie, dass diese Datei nicht existiert. Sie müssen sie selbst erstellen.

6
sorin

Dies ist auch ein Problem in Python 3.6 mit MacOS Sierrra. Ich weiß, dass Ihr Anwendungsfall anders ist. Aber ich bin über diesen Thread gestolpert, als ich dieses Problem untersuchte. Wenn also auch jemand diesen Artikel hat, lohnt sich ein Blick:

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

Kurz gesagt: Python 3.6 ist nicht mehr auf OpenSSL von MacOS angewiesen. Es wird mit einem eigenen openSSL-Paket geliefert und hat keinen Zugriff auf die Stammzertifikate von MacOS.

Sie haben zwei Möglichkeiten:

Führen Sie einen Installationsbefehl aus, der mit Python 3.6 geliefert wurde.

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

oder

Installiere das certifi Paket

Ich habe die erste Option gewählt und es hat funktioniert.

29
j7nn7k

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

Oder von der Kommandozeile:

$ python -m certifi

dann brauche link cacert.pem als cert.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

dann gut funktionieren.

1
luckrill

Als Update und Datenpunkt bin ich auf dieses Problem mit Python 3.7.0 unter macOS 10.13.4 gestoßen:

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

Anweisungen zum Lösen des Problems finden Sie in /Applications/Python\ 3.7/ReadMe.rtf

Dem Vorschlag dort folgend und Ausführen von /Applications/Python\ 3.7/Install\ Certificates.command wurde das Problem gelöst:

Vom Terminal:

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

IPython neu starten ...

$ ipython
>>> import bokeh.sampledata

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

Bei mir schlägt der /Applications/Python\ 3.6/./Install\ Certificates-Befehl bei der Installation von pip certifi fehl. Ich bin auf Mac High Sierra und benutze Python3, so dass Pip etwas ausfällt und ich stattdessen Pip3 verwenden muss. 

Also hier, was ich getan habe:

  1. Manuelle Ausführung von pip3 install --update certify in einer Shell
  2. Entfernen Sie die Installationszertifikatzeile aus dem Befehlsskript
  3. Reran das Skript und alles war gut.

Beachten Sie, dass Sie am Ende einen symbolischen cert.pem-Link erhalten: /Library/Frameworks/Python.framework/Versions/3.6/etc/openssl/

0
Rocko

Führen Sie dies aus, um die entsprechenden Variablen festzulegen. Dies ist eine Kombination der hier bereits gegebenen Antworten. Fügen Sie es in Ihr ~/.bash_profil ein, um es dauerhaft zu machen.

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