ssl.get_server_certificate nesidera su HTTP tarpiniu serveriu. Pirmiausia sukurkite tunelį, tada atlikite TLS su paskirties hosto vardu ir gaukite partnerio sertifikatą.

Neautentifikuotam HTTP tarpiniam serveriui naudokite kandidato iš HTTP tarpinių serverių sąrašo hostą ir prievadą:

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 apdoroja CONNECT užklausą ir jos atsakymą. Tada SSL kontekstas patikrina grandinę ir paskirties tapatybę prieš grąžindamas sertifikatą. Šiam rankos paspaudimui nereikia HTTP GET į paskirties vietą.

Jei aplinka naudoja patvirtintą privatų CA, įkelkite tą CA į kontekstą, o ne išjunkite tikrinimą. Atmesta grandinė lemia, kad parodytas rankos paspaudimas nepavyksta.

getpeercert grąžina partnerio lapinį sertifikatą, o ne automatiškai eksportuotą visą grandinę. Esant patikimam TLS perėmimui, partnerio sertifikatas gali būti tarpininko sugeneruotas sertifikatas šiam hosto vardui. Išsaugokite šį skirtumą lygindami jį su sertifikatu, pastebėtu kitu maršrutu.

Susiję straipsniai