ssl.get_server_certificate forhandler ikke med en HTTP-proxy. Etabler tunnelen først, og utfør deretter TLS med destinasjonens vertsnavn og hent peer-sertifikatet.

For en HTTP-proxy uten autentisering, med vert og port fra en kandidat i HTTP-proxy-listen:

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 håndterer CONNECT-forespørselen og svaret på den. Deretter verifiserer SSL-konteksten kjeden og destinasjonens identitet før sertifikatet returneres. Ingen HTTP GET til destinasjonen kreves for dette håndtrykket.

Hvis miljøet bruker en godkjent privat CA, last den CA-en inn i konteksten i stedet for å deaktivere validering. En avvist kjede gjør at håndtrykket som vises mislykkes.

getpeercert returnerer peerens bladsertifikat, ikke en automatisk eksportert komplett kjede. Ved klarert TLS-avlytting kan peer-sertifikatet være sertifikatet mellomleddet genererte for dette vertsnavnet. Behold denne forskjellen når du sammenligner det med et sertifikat observert via en annen rute.

Relaterte artikler