ssl.get_server_certificate ne négocie pas de proxy HTTP. Établissez d’abord le tunnel, puis effectuez TLS avec le nom d’hôte de destination et récupérez le certificat du pair.

Pour un proxy HTTP sans authentification, en utilisant l’hôte et le port d’un candidat de la liste 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 gère la requête CONNECT et sa réponse. Le contexte SSL vérifie ensuite la chaîne et l’identité de la destination avant que le certificat soit renvoyé. Aucune requête HTTP GET vers la destination n’est nécessaire pour cette poignée de main.

Si l’environnement utilise une AC privée approuvée, chargez cette AC dans le contexte au lieu de désactiver la vérification. Une chaîne rejetée fait échouer la poignée de main montrée.

getpeercert renvoie le certificat feuille du pair, pas une chaîne complète exportée automatiquement. Avec une interception TLS de confiance, le certificat du pair peut être le certificat généré par l’intermédiaire pour ce nom d’hôte. Conservez cette distinction lorsque vous le comparez à un certificat observé par une autre route.

Articles similaires