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.

Articles relacionats