Ler un certificado de par TLS a través dun proxy HTTP en Python
Use a compatibilidade de túnel de HTTPConnection de Python antes de envolver o socket nun contexto SSL que valide.
ssl.get_server_certificate non negocia un proxy HTTP. Estableza primeiro o túnel e despois realice TLS co nome de host do destino e obteña o certificado do par.
Para un proxy HTTP sen autenticación, usando o host e o porto dun candidato da 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 xestiona a solicitude CONNECT e a súa resposta. Despois, o contexto SSL verifica a cadea e a identidade do destino antes de devolver o certificado. Non se necesita ningún HTTP GET ao destino para este handshake.
Se a contorna usa unha CA privada aprobada, cargue esa CA no contexto en lugar de desactivar a verificación. Unha cadea rexeitada fai fallar o handshake mostrado.
getpeercert devolve o certificado folla do par, non unha cadea completa exportada automaticamente. Con interceptación TLS de confianza, o certificado do par pode ser o certificado xerado polo intermediario para este nome de host. Conserve esa distinción ao comparalo cun certificado observado por outra ruta.