Les et TLS-peer-sertifikat gjennom en HTTP-proxy i Python
Bruk HTTPConnection-tunnelstøtten i Python før du pakker socketen inn i en validerende SSL-kontekst.
ssl.get_server_certificate forhandler ikke med en HTTP-proxy. Etabler tunnelen først, og utfør deretter TLS med destinasjonens vertsnavn og hent peer-sertifikatet.
For en HTTP-proxy uten autentisering, med vert 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-forespørselen og svaret på den. Deretter verifiserer SSL-konteksten kjeden og destinasjonens identitet før sertifikatet returneres. Ingen HTTP GET til destinasjonen kreves for dette håndtrykket.
Hvis miljøet bruker en godkjent privat CA, last den CA-en inn i konteksten i stedet for å deaktivere validering. En avvist kjede gjør at håndtrykket som vises mislykkes.
getpeercert returnerer peerens bladsertifikat, ikke en automatisk eksportert komplett kjede. Ved klarert TLS-avlytting kan peer-sertifikatet være sertifikatet mellomleddet genererte for dette vertsnavnet. Behold denne forskjellen når du sammenligner det med et sertifikat observert via en annen rute.