Читање на TLS сертификат на партнер преку HTTP прокси во Python
Користете ја поддршката за тунел на HTTPConnection во Python пред да го завиткате сокетот во SSL контекст што проверува.
ssl.get_server_certificate не преговара со HTTP прокси. Прво воспоставете го тунелот, потоа изведете TLS со името на домаќинот на дестинацијата и добијте го сертификатот на партнерот.
За HTTP прокси без автентикација, користејќи го домаќинот и портата на кандидат од списокот на 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 го обработува барањето CONNECT и неговиот одговор. Потоа SSL контекстот го проверува синџирот и идентитетот на дестинацијата пред сертификатот да биде вратен. За ова ракување не е потребно HTTP GET кон дестинацијата.
Ако околината користи одобрен приватен CA, вчитајте го тој CA во контекстот наместо да ја исклучите проверката. Одбиен синџир го прави прикажаното ракување неуспешно.
getpeercert го враќа листовиот сертификат на партнерот, а не автоматски извезен целосен синџир. При доверливо TLS пресретнување, сертификатот на партнерот може да биде сертификатот што посредникот го создал за ова име на домаќин. Зачувајте ја таа разлика кога го споредувате со сертификат забележан преку друг пат.