TLS-i vastaspoole sertifikaadi lugemine HTTP-proksiga Pythonis
Kasutage Pythoni HTTPConnectioni tunnelituge enne, kui mähite soketi valideerivasse SSL-konteksti.
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.