Čítanie certifikátu protistrany TLS cez HTTP proxy v Pythone
Použite podporu tunela HTTPConnection v Pythone, než soket obalíte overovacím kontextom SSL.
ssl.get_server_certificate nevyjednáva HTTP proxy. Najprv vytvorte tunel, potom vykonajte TLS s názvom hostiteľa cieľa a získajte certifikát protistrany.
Pre HTTP proxy bez autentifikácie použite hostiteľa a port kandidáta zo zoznamu HTTP proxy:
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 spracúva požiadavku CONNECT a jej odpoveď. Kontext SSL potom pred vrátením certifikátu overí reťazec a identitu cieľa. Pre tento handshake nie je potrebná požiadavka HTTP GET na cieľ.
Ak prostredie používa schválenú privátnu CA, načítajte túto CA do kontextu namiesto vypnutia overovania. Odmietnutý reťazec spôsobí zlyhanie zobrazeného handshake.
getpeercert vracia listový certifikát protistrany, nie automaticky exportovaný úplný reťazec. Pri dôveryhodnom odpočúvaní TLS môže byť certifikát protistrany certifikátom, ktorý pre tento názov hostiteľa vytvoril prostredník. Zachovajte tento rozdiel pri porovnávaní s certifikátom pozorovaným inou cestou.