Een TLS-peer-certificaat lezen via een HTTP-proxy in Python
Gebruik de tunnelondersteuning van HTTPConnection in Python voordat u de socket in een validerende SSL-context wikkelt.
ssl.get_server_certificate onderhandelt niet met een HTTP-proxy. Breng eerst de tunnel tot stand en voer daarna TLS uit met de hostnaam van de bestemming en haal het peer-certificaat op.
Voor een HTTP-proxy zonder authenticatie, met de host en poort van een kandidaat uit de HTTP-proxylijst:
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 verwerkt het CONNECT-verzoek en het antwoord daarop. De SSL-context verifieert vervolgens de keten en de identiteit van de bestemming voordat het certificaat wordt teruggegeven. Er is geen HTTP GET naar de bestemming nodig voor deze handshake.
Als de omgeving een goedgekeurde privé-CA gebruikt, laad die CA dan in de context in plaats van verificatie uit te schakelen. Een afgewezen keten laat de getoonde handshake mislukken.
getpeercert geeft het bladcertificaat van de peer terug, geen automatisch geëxporteerde volledige keten. Bij vertrouwde TLS-onderschepping kan het peer-certificaat het door de tussenpartij gegenereerde certificaat voor deze hostnaam zijn. Behoud dat onderscheid wanneer u het vergelijkt met een certificaat dat via een andere route is waargenomen.