Les et TLS-peer-sertifikat gjennom en HTTP-proxy i Python
Bruk Pythons HTTPConnection-tunnelstøtte 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, ved å bruke vert og port til en kandidat fra 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. SSL-konteksten verifiserer deretter kjeden og destinasjonens identitet før sertifikatet returneres. Det kreves ingen HTTP GET til destinasjonen for dette håndtrykket.
Hvis miljøet bruker en godkjent privat CA, last inn denne CA-en 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. Med 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 som er observert via en annen rute.