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.

Kapcsolódó cikkek