ssl.get_server_certificate ne pregovara HTTP proxy. Prvo uspostavite tunel, zatim izvedite TLS s imenom hosta odredišta i preuzmite sertifikat sagovornika.

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 zahtev i njegov odgovor. SSL kontekst zatim proverava lanac i identitet odredišta pre 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 umesto da isključite proveru. Odbijeni lanac čini prikazani handshake neuspešnim.

getpeercert vraća lisni sertifikat sagovornika, a ne automatski izvezen ceo lanac. Uz pouzdano TLS presretanje, sertifikat sagovornika 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.

Povezani članci