Python-Requests - Verwendung von system ca-Zertifikate (debian/ubuntu)?
Habe ich installiert ein selbstsigniertes root-ca-Zertifikat in debian /usr/share/ca-certificates/local
und installiert Sie mit sudo dpkg-reconfigure ca-certificates
. An dieser Stelle true | gnutls-cli mysite.local
freut sich, und true | openssl s_client -connect mysite.local:443
ist glücklich, aber python2-und Python ist3 Anforderungen Modul besteht darauf, es ist nicht zufrieden mit dem cert.
python2:
Traceback (most recent call last):
File "<string>", line 1, in <module>
File "/usr/local/lib/python2.7/site-packages/requests/api.py", line 70, in get
return request('get', url, params=params, **kwargs)
File "/usr/local/lib/python2.7/site-packages/requests/api.py", line 56, in request
return session.request(method=method, url=url, **kwargs)
File "/usr/local/lib/python2.7/site-packages/requests/sessions.py", line 488, in request
resp = self.send(prep, **send_kwargs)
File "/usr/local/lib/python2.7/site-packages/requests/sessions.py", line 609, in send
r = adapter.send(request, **kwargs)
File "/usr/local/lib/python2.7/site-packages/requests/adapters.py", line 497, in send
raise SSLError(e, request=request)
requests.exceptions.SSLError: ("bad handshake: Error([('SSL routines', 'ssl3_get_server_certificate', 'certificate verify failed')],)",)
Python ist3
Traceback (most recent call last):
File "<string>", line 1, in <module>
File "/usr/local/bin/python3.5/site-packages/requests/api.py", line 70, in get
return request('get', url, params=params, **kwargs)
File "/usr/local/bin/python3.5/site-packages/requests/api.py", line 56, in request
return session.request(method=method, url=url, **kwargs)
File "/usr/local/bin/python3.5/site-packages/requests/sessions.py", line 488, in request
resp = self.send(prep, **send_kwargs)
File "/usr/local/bin/python3.5/site-packages/requests/sessions.py", line 609, in send
r = adapter.send(request, **kwargs)
File "/usr/local/bin/python3.5/site-packages/requests/adapters.py", line 497, in send
raise SSLError(e, request=request)
requests.exceptions.SSLError: ("bad handshake: Error([('SSL routines', 'ssl3_get_server_certificate', 'certificate verify failed')],)",)
Warum python ignoriert das system-ca-Zertifikate bundle, und wie integriere ich es?
InformationsquelleAutor ThorSummoner | 2017-03-23
Du musst angemeldet sein, um einen Kommentar abzugeben.
Vom https://stackoverflow.com/a/33717517/1695680
Machen python-requests verwenden Sie das system-ca-Zertifikate bündeln, es muss gesagt werden, wenn es über seine eigene embedded-bundle
Anforderungen verankert sein Bündel hier, für Referenz:
InformationsquelleAutor
Ich kämpfte mit diesem für eine Woche oder so vor kurzem. Schließlich fand ich, dass die Möglichkeit zu überprüfen, ein selbst signiertes oder privat, signiert, mit Zertifikat in Python. Müssen Sie Ihr eigenes Zertifikat erstellen Sie eine bundle-Datei. Keine Notwendigkeit zu aktualisieren, zu verdecken Zertifikat bündelt jedes mal, wenn Sie ein update einer Bibliothek, oder fügen Sie etwas, um die system-Zertifikatsspeicher.
Starten Sie, indem Sie das openssl-Befehl, den Sie lief vor, aber add-showcerts.
openssl s_client -connect mysite.local:443 -showcerts
Dies wird Ihnen eine lange Ausgabe, und am oberen Rand sehen Sie die gesamte Zertifikate-Kette. In der Regel bedeutet dies, drei Konzerten, die Webseite das Zertifikat, die Zwischenzertifikate und das root-Zertifikat in dieser Reihenfolge. Wir müssen nur die root-und intermediate-Zertifikate in einer Datei in umgekehrter Reihenfolge.Kopie der letzten cert root-Zertifikat, um eine neue text-Datei. Schnappen Sie sich nur das Zeug zwischen und einschließlich:
Kopieren der Mitte cert (aka the intermediate certificate) der neue text-Datei unter dem root-cert. Wieder greifen die Begin-und End-Zertifikat Linien und alles dazwischen.
Speichern Sie diese Textdatei in das Verzeichnis, wo Sie Ihre Python-Skript befindet. Meine Empfehlung ist, es zu nennen
CertBundle.pem
. (Wenn Sie einen anderen Namen ein, oder legen Sie ihn irgendwo in Ihrer Ordner-Struktur, stellen Sie sicher, stellen Sie sicher, dass die Linie spiegelt das wider.) Aktualisieren Sie Ihr Skript, um Sie auf den neuen Zertifikat-bundle:Und das ist es. Wenn Sie nur die Wurzel oder nur das intermediate-Zertifikat, dann Python kann nicht überprüfen, das gesamte Zertifikate-Kette. Aber, wenn Sie beide Zertifikate im Zertifikat-bundle, das Sie erstellt haben, dann Python kann bestätigen, dass das Zwischenprodukt wurde unterzeichnet von der Wurzel, und dann, wenn es auf die website zugreift, kann es überprüfen, dass das Zertifikat der website wurde unterzeichnet von den intermediate-Zertifikat.
edit: Behoben, der Datei-Erweiterung für die cert-bundle. Auch, festen ein paar grammatikalische Fehler.
Ich hätte fast gesagt etwas darüber, dass in meinem post. Ich ging mit p7b, weil ich denke, dass dies die richtige Erweiterung, aber für diesen Zweck ist es egal. Es kann sein .txt, oder keine Erweiterung überhaupt. Das wichtigste ist, dass Sie Ihre Python-Skript die Datei finden kann.
ist korrekt; diese Datei sollte die
.pem
Erweiterung und einige Werkzeuge unsachgemäß gebrauchen, weil es die falsche Endung..pem
ist die de facto standard-Erweiterung für diese base64-kodiertes Zertifikat-format, während die binäre version des gleichen formats ist.der
, und.p7b
ist ein verschiedenen base64-kodierten format. Ein praktisches Nachschlagewerk, wie konvertieren unter Ihnen mitopenssl
CLI-tools: knowledge.digicert.com/solution/SO26449.htmlInformationsquelleAutor fryad