Læs et TLS-peer-certifikat gennem en HTTP-proxy i Python
Brug Pythons HTTPConnection-tunnelunderstøttelse, før soklen pakkes ind i en validerende SSL-kontekst.
ssl.get_server_certificate forhandler ikke med en HTTP-proxy. Etabler først tunnelen, og udfør derefter TLS med destinationsværtens navn og hent peer-certifikatet.
Til en HTTP-proxy uden godkendelse, ved at bruge værtsnavn og port fra en kandidat i HTTP-proxy-listen:
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 håndterer CONNECT-anmodningen og dens svar. SSL-konteksten verificerer derefter kæden og destinationens identitet, før certifikatet returneres. Der kræves ingen HTTP GET til destinationen for dette handshake.
Hvis miljøet bruger en godkendt privat CA, skal du indlæse denne CA i konteksten i stedet for at deaktivere validering. En afvist kæde får det viste handshake til at mislykkes.
getpeercert returnerer peerens bladcertifikat, ikke en automatisk eksporteret komplet kæde. Med betroet TLS-aflytning kan peer-certifikatet være det certifikat, mellemleddet har genereret til dette værtsnavn. Bevar den forskel, når du sammenligner det med et certifikat, der er observeret ad en anden rute.