Ein TLS-Peer-Zertifikat über einen HTTP-Proxy in Python lesen
Nutzen Sie die Tunnelunterstützung von HTTPConnection in Python, bevor Sie den Socket in einen validierenden SSL-Kontext einbetten.
ssl.get_server_certificate handelt keinen HTTP-Proxy aus. Stellen Sie zuerst den Tunnel her, führen Sie dann TLS mit dem Hostnamen des Ziels aus und holen Sie das Peer-Zertifikat ab.
Für einen HTTP-Proxy ohne Authentifizierung mit Host und Port eines Kandidaten aus der HTTP-Proxy-Liste:
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 übernimmt die CONNECT-Anfrage und deren Antwort. Anschließend prüft der SSL-Kontext die Kette und die Identität des Ziels, bevor das Zertifikat zurückgegeben wird. Für diesen Handshake ist kein HTTP GET an das Ziel erforderlich.
Verwendet die Umgebung eine zugelassene private CA, laden Sie diese CA in den Kontext, statt die Prüfung zu deaktivieren. Eine abgelehnte Kette lässt den gezeigten Handshake scheitern.
getpeercert gibt das Blattzertifikat des Peers zurück, keine automatisch exportierte vollständige Kette. Bei vertrauenswürdiger TLS-Interception kann das Peer-Zertifikat das vom Zwischenglied erzeugte Zertifikat für diesen Hostnamen sein. Bewahren Sie diesen Unterschied, wenn Sie es mit einem über einen anderen Weg beobachteten Zertifikat vergleichen.