Čitanje TLS sertifikata partnera kroz HTTP proxy u Pythonu
Koristite podršku za tunel HTTPConnection u Pythonu prije nego što soket obavijete SSL kontekstom koji provjerava.
ssl.get_server_certificate ne pregovara HTTP proxy. Prvo uspostavite tunel, zatim izvršite TLS s imenom hosta odredišta i preuzmite sertifikat partnera.
Za HTTP proxy bez autentifikacije, koristeći host i port kandidata iz liste 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 sertifikat 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 neuspješnim.
getpeercert vraća lisni sertifikat partnera, a ne automatski izvezen kompletan lanac. Uz pouzdano TLS presretanje, sertifikat partnera može biti sertifikat koji je posrednik generisao za ovo ime hosta. Sačuvajte tu razliku kada ga upoređujete sa sertifikatom uočenim drugim putem.