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.

Artículos relacionados