ssl.get_server_certificate nevyjednává HTTP proxy. Nejprve vytvořte tunel, poté proveďte TLS s názvem hostitele cíle a získejte certifikát protistrany.

Pro HTTP proxy bez autentizace použijte hostitele a port kandidáta ze seznamu 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)

HTTPConnection zpracovává požadavek CONNECT a jeho odpověď. Kontext SSL pak před vrácením certifikátu ověří řetězec a identitu cíle. Pro toto handshake není potřeba HTTP GET na cíl.

Pokud prostředí používá schválenou privátní CA, načtěte tuto CA do kontextu místo vypnutí ověřování. Odmítnutý řetězec způsobí selhání zobrazeného handshake.

getpeercert vrací listový certifikát protistrany, nikoli automaticky exportovaný úplný řetězec. Při důvěryhodném odposlechu TLS může být certifikát protistrany certifikátem, který pro tento název hostitele vytvořil prostředník. Tento rozdíl zachovejte při srovnání s certifikátem pozorovaným jinou cestou.

Související články