ssl.get_server_certificate ei läbi HTTP-proksiga läbirääkimisi. Kõigepealt looge tunnel, seejärel tehke TLS sihtkoha hostinimega ja hankige vastaspoole sertifikaat.

Autentimata HTTP-proksi puhul, kasutades HTTP-prokside loendist kandidaadi hosti ja porti:

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 haldab CONNECT-päringut ja selle vastust. Seejärel kontrollib SSL-kontekst ahelat ja sihtkoha identiteeti enne sertifikaadi tagastamist. Selle käepigistuse jaoks pole sihtkohale HTTP GET-i vaja.

Kui keskkond kasutab heakskiidetud privaatset CA-d, laadige see CA konteksti, selle asemel et kontrollimine välja lülitada. Tagasi lükatud ahel paneb näidatud käepigistuse nurjuma.

getpeercert tagastab vastaspoole lehtsertifikaadi, mitte automaatselt eksporditud täieliku ahela. Usaldusväärse TLS-i vaheltlõike korral võib vastaspoole sertifikaat olla vahendaja loodud sertifikaat selle hostinime jaoks. Säilitage see erinevus, kui võrdlete seda mõne muu tee kaudu täheldatud sertifikaadiga.

Seotud artiklid