Čitanje TLS certifikata sugovornika kroz HTTP proxy u Pythonu
Upotrijebite podršku za tunel HTTPConnection u Pythonu prije nego što omotate socket u SSL kontekst koji provjerava.
ssl.get_server_certificate ne pregovara HTTP proxy. Najprije uspostavite tunel, zatim izvedite TLS s imenom hosta odredišta i dohvatite certifikat sugovornika.
Za HTTP proxy bez autentikacije, koristeći host i port kandidata iz popisa HTTP proxyja:
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)
HTTPConnection obrađuje CONNECT zahtjev i njegov odgovor. SSL kontekst zatim provjerava lanac i identitet odredišta prije nego što se certifikat vrati. Za ovaj handshake nije potreban HTTP GET prema odredištu.
Ako okruženje koristi odobreni privatni CA, učitajte taj CA u kontekst umjesto da isključite provjeru. Odbijeni lanac čini prikazani handshake neuspjelim.
getpeercert vraća lisni certifikat sugovornika, a ne automatski izvezen cijeli lanac. Uz pouzdano TLS presretanje, certifikat sugovornika može biti certifikat koji je posrednik generirao za ovo ime hosta. Zadržite tu razliku kada ga uspoređujete s certifikatom uočenim drugim putem.