Lire un certificat de pair TLS via un proxy HTTP en Python
Utilisez la prise en charge du tunnel d’HTTPConnection de Python avant d’envelopper la socket dans un contexte SSL qui valide.
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.