Hindi nakikipag-usap ang ssl.get_server_certificate sa isang HTTP proxy. Itayo muna ang tunnel, pagkatapos ay gawin ang TLS gamit ang hostname ng destinasyon at kunin ang peer certificate.

Para sa HTTP proxy na walang authentication, gamit ang host at port ng kandidato mula sa listahan ng HTTP proxy:

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)

Pinangangasiwaan ng HTTPConnection ang CONNECT request at ang tugon nito. Pagkatapos ay vine-verify ng SSL context ang chain at ang pagkakakilanlan ng destinasyon bago ibalik ang certificate. Walang HTTP GET sa destinasyon ang kailangan para sa handshake na ito.

Kung gumagamit ang kapaligiran ng aprubadong pribadong CA, i-load ang CA na iyon sa context sa halip na i-disable ang verification. Ang tinanggihang chain ay nagpapabigo sa ipinakitang handshake.

Ibinabalik ng getpeercert ang leaf certificate ng peer, hindi ang awtomatikong na-export na buong chain. Sa pinagkakatiwalaang TLS interception, ang peer certificate ay maaaring ang certificate na ginawa ng intermediary para sa hostname na ito. Panatilihin ang pagkakaibang iyon kapag inihahambing ito sa certificate na naobserbahan sa ibang ruta.

Kaugnay na mga artikulo