Python-requests-SSL-Zertifikat die überprüfung fehl, selbst nach Zugabe der CA-Zertifikate
Habe ich mit der Python-Requests-Bibliothek zu kratzen, eine website für eine Weile jetzt, aber die website vor kurzem geändert, SSL-Zertifikate und das neue cert nicht verifizieren-Anfragen.
Basieren auf den Antworten zu ähnlichen Fragen, habe ich aktualisiert, Anfragen und urllib3 auf die neueste Version (2.4.3 und 1.9.1), und manuell Hinzugefügt werden, die CA-certs zu ersuchen " cacert.pem (/usr/local/lib/python2.7/dist-packages/requests/cacert.pem).
Kann ich erfolgreich nutzen diese cacert.pem-Datei mit curl, aber noch nicht mit Anfragen:
> curl --head --cacert /usr/local/lib/python2.7/dist-packages/requests/cacert.pem
https://jordan-cu.org
HTTP/1.1 200 OK
Date: Thu, 20 Nov 2014 16:21:28 GMT
Server: Apache
X-Pingback: https://jordan-cu.org/xmlrpc.php
Link: <https://jordan-cu.org/>; rel=shortlink
X-Powered-By: PleskLin
Content-Type: text/html; charset=UTF-8
> python
Python 2.7.4 (default, Sep 26 2013, 03:20:26)
[GCC 4.7.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> requests.get('https://jordan-cu.org')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/local/lib/python2.7/dist-packages/requests/api.py", line 60, in get
return request('get', url, **kwargs)
File "/usr/local/lib/python2.7/dist-packages/requests/api.py", line 49, in request
return session.request(method=method, url=url, **kwargs)
File "/usr/local/lib/python2.7/dist-packages/requests/sessions.py", line 457, in request
resp = self.send(prep, **send_kwargs)
File "/usr/local/lib/python2.7/dist-packages/requests/sessions.py", line 569, in send
r = adapter.send(request, **kwargs)
File "/usr/local/lib/python2.7/dist-packages/requests/adapters.py", line 420, in send
raise SSLError(e, request=request)
requests.exceptions.SSLError: [Errno 1] _ssl.c:504: error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed
Ich bin mir nicht sicher, was anderes zu versuchen, an dieser Stelle. Jede Hilfe ist willkommen!
- Sie vielleicht überprüfen Sie mit
strace -e open,stat ...
wenn der python installation verwendet cacert.pem, die Sie erwarten, es zu verwenden, oder wenn es sieht woanders für die Zertifikate. - strace zeigt, dass es mit sich, dass cacert.pem-Datei. Ich habe auch überprüft, dass es durch absichtliches hinzufügen von einigen malformated Daten zu cacert.pem zu sehen, ob es ausgelöst ein Fehler in Anfragen (es tut).
- Nach dem Graben einige mehr, ich dachte, dass es möglicherweise ein Schlüssel-Problem. Ich habe versucht, herauszufinden, einen Weg angeben, einem eingeschränkten Satz von Chiffren mit Anfragen, die zimmerreserviereung, ohne das Sie den patch-code, aber es sieht nicht wie das möglich ist.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Zu installieren, müssen Sie pyopenssl und ndg-httpsclient
Sehen über Anfragen mit TLS nicht geben SNI-Unterstützung für mehr details
Python2 hat keine Unterstützung für SNI-Anfragen nicht in dieser Hinsicht helfen, sehen http://docs.python-requests.org/en/latest/community/faq/. Aber, wenn Zugriff auf den Inhalt ohne SNI gibt der server ein selbstsigniertes Zertifikat:
Wenn man stattdessen greift auf den server mit SNI-es gibt ein Zertifikat von einer öffentlichen ZERTIFIZIERUNGSSTELLE:
Weil Python2 hat die TLS-Verbindung, ohne SNI erhalten Sie das selbstsignierte Zertifikat, das kann natürlich nicht verifiziert werden, gegen
cacert.pem
und so erhalten Siecertificate verify failed
.Update: Upgrade auf Python ist3 unterstützt SNI.
Erstellen Sie eine PEM-Datei mit der gesamten Zertifikatskette. Ihr Zertifikat + intermediate certificate + - root-Zertifikat.