Branje certifikata partnerja TLS prek HTTP posrednika v Pythonu
Uporabite podporo za tunel HTTPConnection v Pythonu, preden vtičnico ovijete v kontekst SSL, ki preverja.
ssl.get_server_certificate se ne pogaja s HTTP posrednikom. Najprej vzpostavite tunel, nato izvedite TLS z imenom gostitelja cilja in pridobite certifikat partnerja.
Za HTTP posrednika brez overjanja uporabite gostitelja in vrata kandidata s seznama HTTP posrednikov:
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 obdela zahtevo CONNECT in njen odgovor. Kontekst SSL nato pred vrnitvijo certifikata preveri verigo in identiteto cilja. Za to rokovanje ni potrebna zahteva HTTP GET na cilj.
Če okolje uporablja odobreno zasebno CA, naložite to CA v kontekst, namesto da onemogočite preverjanje. Zavrnjena veriga povzroči neuspeh prikazanega rokovanja.
getpeercert vrne listni certifikat partnerja, ne samodejno izvožene celotne verige. Pri zaupanja vrednem prestrezanju TLS je lahko certifikat partnerja certifikat, ki ga je posrednik ustvaril za to ime gostitelja. Ohranite to razliko, ko ga primerjate s certifikatom, opaženim po drugi poti.