ssl.get_server_certificate nepārrunā HTTP starpniekserveri. Vispirms izveidojiet tuneli, pēc tam veiciet TLS ar galamērķa resursdatora nosaukumu un iegūstiet partnera sertifikātu.

Neautentificētam HTTP starpniekserverim, izmantojot kandidāta resursdatoru un portu no HTTP starpniekserveru saraksta:

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 apstrādā CONNECT pieprasījumu un tā atbildi. Pēc tam SSL konteksts pārbauda ķēdi un galamērķa identitāti, pirms sertifikāts tiek atgriezts. Šim rokasspiedienam nav nepieciešams HTTP GET uz galamērķi.

Ja vide izmanto apstiprinātu privātu CA, ielādējiet šo CA kontekstā, nevis atslēdziet pārbaudi. Noraidīta ķēde liek parādītajam rokasspiedienam neizdoties.

getpeercert atgriež partnera lapas sertifikātu, nevis automātiski eksportētu pilnu ķēdi. Uzticamas TLS pārtveršanas gadījumā partnera sertifikāts var būt starpnieka ģenerētais sertifikāts šim resursdatora nosaukumam. Saglabājiet šo atšķirību, salīdzinot to ar sertifikātu, kas novērots citā maršrutā.

Saistītie raksti