Leer un certificado de par TLS a través de un proxy HTTP en Python
Use la compatibilidad de túnel de HTTPConnection de Python antes de envolver el socket con un contexto SSL que valide.
ssl.get_server_certificate no negocia un proxy HTTP. Establezca primero el túnel y después realice TLS con el nombre de host del destino y obtenga el certificado del par.
Para un proxy HTTP sin autenticación, usando el host y el puerto de un candidato de la lista de proxies 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 solicitud CONNECT y su respuesta. Después, el contexto SSL verifica la cadena y la identidad del destino antes de devolver el certificado. No se necesita ningún HTTP GET al destino para este handshake.
Si el entorno usa una CA privada aprobada, cargue esa CA en el contexto en lugar de desactivar la verificación. Una cadena rechazada hace que falle el handshake mostrado.
getpeercert devuelve el certificado hoja del par, no una cadena completa exportada automáticamente. Con interceptación TLS de confianza, el certificado del par puede ser el certificado generado por el intermediario para este nombre de host. Conserve esa distinción al compararlo con un certificado observado por otra ruta.