TLS-partner tanúsítványának olvasása HTTP-proxyn keresztül Pythonban
Használja a Python HTTPConnection tuneltámogatását, mielőtt a socketet ellenőrző SSL-környezetbe csomagolná.
Az ssl.get_server_certificate nem tárgyal HTTP-proxyt. Először hozza létre az alagutat, majd végezzen TLS-t a cél hosztnevével, és szerezze be a partner tanúsítványát.
Hitelesítés nélküli HTTP-proxy esetén a HTTP-proxy lista egyik jelöltjének hosztját és portját használva:
from contextlib import closing
import http.client
import ssl
hostname = "example.com"
context = ssl.create_default_context()
with closing(http.client.HTTPConnection(
"proxy.example.net", 8080, timeout=10
)) as connection:
connection.set_tunnel(hostname, 443)
connection.connect()
with context.wrap_socket(
connection.sock, server_hostname=hostname
) as tls:
certificate_der = tls.getpeercert(binary_form=True)
certificate_pem = ssl.DER_cert_to_PEM_cert(certificate_der)
A HTTPConnection kezeli a CONNECT kérést és annak válaszát. Ezután az SSL-környezet ellenőrzi a láncot és a cél azonosságát, mielőtt a tanúsítvány visszaadásra kerül. Ehhez a kézfogáshoz nem szükséges HTTP GET a cél felé.
Ha a környezet jóváhagyott privát CA-t használ, töltse be azt a CA-t a környezetbe az ellenőrzés kikapcsolása helyett. Az elutasított lánc miatt a bemutatott kézfogás meghiúsul.
A getpeercert a partner levéltanúsítványát adja vissza, nem egy automatikusan exportált teljes láncot. Megbízható TLS-elfogás esetén a partner tanúsítványa lehet a köztes fél által ehhez a hosztnévhez létrehozott tanúsítvány. Őrizze meg ezt a különbséget, amikor egy másik útvonalon megfigyelt tanúsítványhoz hasonlítja.