Llegir un certificat de parell TLS a través d'un proxy HTTP en Python
Utilitzeu el suport de túnel d'HTTPConnection de Python abans d'embolcallar el sòcol amb un context SSL que validi.
ssl.get_server_certificate no negocia un proxy HTTP. Establiu primer el túnel, després feu TLS amb el nom d'amfitrió de destinació i obteniu el certificat del parell.
Per a un proxy HTTP sense autenticació, fent servir l'amfitrió i el port d'un candidat de la llista de proxys HTTP:
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 gestiona la sol·licitud CONNECT i la seva resposta. Després, el context SSL verifica la cadena i la identitat de destinació abans de retornar el certificat. No cal cap HTTP GET a la destinació per a aquesta negociació.
Si l'entorn utilitza una CA privada aprovada, carregueu aquesta CA al context en lloc de desactivar la verificació. Una cadena rebutjada fa fallar la negociació mostrada.
getpeercert retorna el certificat fulla del parell, no una cadena completa exportada automàticament. Amb una intercepció TLS de confiança, el certificat del parell pot ser el certificat generat per l'intermediari per a aquest nom d'amfitrió. Preserveu aquesta distinció en comparar-lo amb un certificat observat per una altra ruta.