Versuchen Sie, das SSL-Zertifikat aus einer Antwort in requests
zu erhalten.
Was ist ein guter Weg, dies zu tun?
Vielen Dank!
requests
schließt bewusst Low-Level-Sachen wie diese ein. Normalerweise ist das einzige, was Sie tun möchten, zu überprüfen, dass die Zertifikate gültig sind . Übergeben Sie dazu verify=True
. Wenn Sie ein nicht standardmäßiges Cacert-Bündel verwenden möchten, können Sie das auch übergeben. Zum Beispiel:
Außerdem ist requests
in erster Linie eine Reihe von Wrappern um andere Bibliotheken herum, meist urllib3
und die Stdlibs http.client
(oder für 2.x, httplib
) und %Co_de% .
Manchmal ist die Antwort nur, auf die Objekte der unteren Ebene zu kommen (z. B. ssl
ist resp.raw
), aber in vielen Fällen ist das unmöglich.
Und das ist einer dieser Fälle. Die einzigen Objekte, die jemals die Zertifikate sehen, sind ein urllib3.response.HTTPResponse
(oder ein http.client.HTTPSConnection
, aber das ist nur eine Unterklasse des ersteren) und ein urllib3.connectionpool.VerifiedHTTPSConnection
, und beide existieren nicht mehr, wenn die Anfrage zurückkommt. (Wie der Name ssl.SSLSocket
impliziert, wird das connectionpool
-Objekt in einem Pool gespeichert und kann wiederverwendet werden, sobald es fertig ist; das HTTPSConnection
ist ein Mitglied von SSLSocket
.)
Sie müssen also Dinge patchen, damit Sie die Daten in der Kette kopieren können. Es kann so einfach sein:
%Vor%Das ist nicht getestet, also keine Garantien; Sie müssen möglicherweise mehr als das patchen.
Auch Subclassing und Overriding wären wahrscheinlich sauberer als Monkeypatching (insbesondere da HTTPSConnection
als Unterklasse entworfen wurde).
Oder noch besser, indem Sie HTTPAdapter
und urllib3
forkieren, Ihre Verzweigung ändern und (wenn Sie denken, dass dies recht nützlich ist) Pull-Requests upstream senden.
Wie auch immer, jetzt, aus Ihrem Code, können Sie das tun:
%Vor%Natürlich möchten Sie vielleicht auch alle notwendigen Informationen weitergeben, um das Zertifikat zu verifizieren, aber das ist noch einfacher, weil es bereits die oberste Ebene durchläuft.
Um zu beginnen, ist abarnerts Antwort sehr vollständig
Aber ich möchte hinzufügen, dass Sie für den Fall, dass Sie nach der Peer-Cert-Kette suchen, noch einen weiteren Code packen müssen
%Vor%danach können Sie es in einer sehr ähnlichen Weise als die angenommene Antwort nennen
%Vor% Sie erhalten resp.peercertchain
, das ein tuple
von OpenSSL.crypto.X509
Objekte
Tags und Links python https http request python-requests