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.

Artigos relacionados