ssl.get_server_certificate forhandlar ikkje med ein HTTP-proxy. Set opp tunnelen først, og utfør deretter TLS med vertsnamnet til destinasjonen og hent peer-sertifikatet.

For ein HTTP-proxy utan autentisering, ved å bruke vert og port til ein kandidat frå HTTP-proxy-lista:

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 handterer CONNECT-førespurnaden og svaret på han. SSL-konteksten verifiserer deretter kjeda og identiteten til destinasjonen før sertifikatet blir returnert. Det krevst ingen HTTP GET til destinasjonen for denne handtrykket.

Viss miljøet brukar ein godkjend privat CA, last inn denne CA-en i konteksten i staden for å slå av validering. Ei avvist kjede gjer at handtrykket som blir vist mislykkast.

getpeercert returnerer bladsertifikatet til peer-en, ikkje ei automatisk eksportert fullstendig kjede. Med klarert TLS-avlytting kan peer-sertifikatet vere sertifikatet mellomleddet genererte for dette vertsnamnet. Hald på denne skilnaden når du samanliknar det med eit sertifikat som er observert via ein annan rute.

Relaterte artiklar