Lees 'n TLS-eweknie-sertifikaat deur 'n HTTP-proxy in Python
Gebruik Python se HTTPConnection-tonnelondersteuning voordat die sok met 'n validerende SSL-konteks toegedraai word.
ssl.get_server_certificate onderhandel nie 'n HTTP-proxy nie. Stel eers die tonnel op en doen dan TLS met die bestemming se gasheernaam en verkry die eweknie-sertifikaat.
Vir 'n HTTP-proxy sonder verifikasie, met die gasheer en poort van 'n kandidaat uit die HTTP-proxylys:
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 hanteer die CONNECT-versoek en die antwoord daarop. Die SSL-konteks verifieer dan die ketting en die bestemming se identiteit voordat die sertifikaat teruggegee word. Geen HTTP GET na die bestemming is vir hierdie handdruk nodig nie.
As die omgewing 'n goedgekeurde private CA gebruik, laai daardie CA in die konteks in plaas daarvan om verifikasie af te skakel. 'n Verwerpte ketting laat die getoonde handdruk misluk.
getpeercert gee die eweknie se bladsertifikaat terug, nie 'n outomaties uitgevoerde volledige ketting nie. Met vertroude TLS-onderskepping kan die eweknie-sertifikaat die tussenganger se geskepte sertifikaat vir hierdie gasheernaam wees. Behoud daardie onderskeid wanneer jy dit met 'n sertifikaat vergelyk wat deur 'n ander roete waargeneem is.