Читање TLS сертификата саговорника кроз HTTP прокси у Python-у
Користите подршку за тунел HTTPConnection у Python-у пре него што обавијете socket 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 контекст затим проверава ланац и идентитет одредишта пре него што се сертификат врати. За овај handshake није потребан HTTP GET према одредишту.
Ако окружење користи одобрени приватни CA, учитајте тај CA у контекст уместо да искључите проверу. Одбијени ланац чини приказани handshake неуспешним.
getpeercert враћа лисни сертификат саговорника, а не аутоматски извезен цео ланац. Уз поуздано TLS пресретање, сертификат саговорника може бити сертификат који је посредник генерисао за ово име хоста. Сачувајте ту разлику када га упоређујете са сертификатом уоченим другим путем.