Wie bekomme ich ein SSL-Zertifikat von Anfragen in Python?

8

Versuchen Sie, das SSL-Zertifikat aus einer Antwort in requests zu erhalten.

Was ist ein guter Weg, dies zu tun?

Vielen Dank!

    
Juan Carlos Coto 03.06.2013, 18:37
quelle

3 Antworten

8

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:

%Vor%

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.

    
abarnert 03.06.2013, 19:56
quelle
5

Dies, obwohl überhaupt nicht hübsch, funktioniert:

%Vor%     
t-8ch 03.06.2013 19:44
quelle
1

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

    
GoldenStake 21.12.2017 18:55
quelle