SSL-Zertifikat-Verifizierungsfehler in Python auf Mavericks

Ich habe ein anhaltendes Problem mit der SSL-Bestätigung.

SSL: CERTIFICATE_VERIFY_FAILED

Ich habe den Fehler beim Erstellen einer Django-App entdeckt, bei der sich Benutzer mit Mozilla Persona authentifiziert haben.

(python3.4)> import requests
(python3.4)> requests.get('https://verifier.login.persona.org')

Ich bekomme einSSL: CERTIFICATE_VERIFY_FAILED zurückverfolgen vonrequests zuurllib3 zussl:

...
"/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/ssl.py", line 805, in do_handshake
    self._sslobj.do_handshake()
ssl.SSLError: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:598)

...
"/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/site-packages/requests-2.4.1-py3.4.egg/requests/packages/urllib3/connectionpool.py", line 543, in urlopen
    raise SSLError(e)
requests.packages.urllib3.exceptions.SSLError: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:598)

...
"/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/site-packages/requests-2.4.1-py3.4.egg/requests/adapters.py", line 420, in send
    raise SSLError(e, request=request)
requests.exceptions.SSLError: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:598)
Unterschied zwischen python3 und python2

Hier beginnt es interessant zu werden: Ich bekomme nicht das gleiche Problem bei der Verwendung von python2.7:

(python2.7)> import requests
(python2.7)> requests.get('https://verifier.login.persona.org')
<Response [200]>

Mein erster Gedanke war, dass die beiden Versionen vonrequests verwendet möglicherweise unterschiedliche Zertifikate [1], daher war ich ziemlich überrascht, dass die beiden Dateien genau gleich waren:

(bash)$ diff `python3.4 -c "import requests; print(requests.certs.where())"` \
             `python2.7 -c "import requests; print requests.certs.where()"`
# no diff
Error in openssl neu erstellt und mit -CAFile @ gelö

Interessanterweise ist das Problem nicht auf python3.4 [2] beschränkt.

(bash)$ openssl s_client -connect github.com:443
...
Verify return code: 20 (unable to get local issuer certificate)

Bearbeite Ein Kommentar von Steffen hat mich darüber informiert, dass diese "Debugging" -Methode nicht wirklich informativ ist, das_client erwartet einen -CApath zur Überprüfung. Die Tatsache, dass ich das gleiche Zertifikat angeben kann, dass dasrequests Paket wird verwendet und ich bekomme nicht den gleichen Fehler ist immer noch interessant:

(bash)$ openssl s_client -connect github.com:443 \
        -CAfile `python3 -c 'import requests; print(requests.certs.where())'`
...
Verify return code: 0 (ok)

u diesem Zeitpunkt bin ich völlig außer meinem Element. Ich weiß nicht, ob das wirklich ein @ iopenssl Problem oder etwas über OSX Mavericks. Hier ist die Version von openssl, die ich verwende:

(bash)$ openssl version
OpenSSL 1.0.1f 6 Jan 2014
Mavericks KeyChain.app

Für betriebssystemspezifische Lösungen habe ich versucht, meinen Login-KeyChain [4] ohne Erfolg zu löschen.

Probleme mit pip

Es gibt noch einen letzten Beweis, der relevant sein kann oder nicht. python3.4 wird mit intaktem pip ausgeliefert. Der Befehl pip3 ist für mich jedoch nutzlos. Egal was ich versuche zu installieren:

(bash)$ pip3 install [new-lib] # pip 1.5.6

Ich bekomme

Downloading/unpacking [new-lib]
    Cannot fetch index base URL https://pypi.python.org/simple/
    Could not find any downloads that satisfy the requirement [new-lib]
Cleaning up...
    No distributions at all found for [new-lib]
    Storing debug log for failure in ~/.pip/pip.log

Obwohl dies kein (expliziter) SSL-Fehler ist, scheint es ähnlich zu sein [5] und eine erfolgreiche Problemumgehung bestand darin, eine ältere Version von pip mit @ zu installiereeasy_install in meinemvirtualenvs [5]. Ich drücke die Daumen, dass die beiden Probleme zusammenhängen.

Rekapitulieren

Suchen nach möglichen Lösungen für den Fehler beim Versagen eines SSL-Zertifikats (ohne Verwendung vonverify = False in demrequests Anrufe)Ich erhalte den Fehler in python3.4, aber nicht in python2.7, obwohl die in beiden Fällen verwendete cert.pem genau dieselbe ist.Obwohl ich mit @ einen SSL-Fehler wiederherstellen kaopenssl s_client -connect Ich kann das vermeiden, indem ich @ eingeb-CAFile zu dem von der Anforderungsbibliothek verwendeten cert.pem.Meine Vermutung ist, dass dies ein spezielles Problem für Mavericks ist, aber ich habe keine Ahnung, wie ich vorgehen soll. Ich hoffe, eine Lösung zu finden, mit der ich auch Python3.4-Pakete mit pip3 wie erwartet installieren kann.

Danke für Ihre Hilfe

[1]: python2.7 wurde auf meinem Computer mit Enthought installiert. Die Installation einer Systemversion von python2.7 und der Anforderungsbibliothek funktioniert jedoch auch.

[2]: Sieheopenssl, Python fordert Fehler an: "Zertifikatprüfung fehlgeschlagen" für ein ähnliches Problem mit Python 2.7

[3]: Es scheint, dass Mavericks eine Änderung in openssl eingeführt hat?http: //curl.haxx.se/mail/archive-2013-10/0036.htm

[4]: Clearning KeyChain.app von hier:https: //superuser.com/a/721629/26187

[5]: SSL-Fehler mit pip3:https: //stackoverflow.com/a/22051466/250607

Antworten auf die Frage(2)

Ihre Antwort auf die Frage