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 кедергісі кезінде серіктес сертификаты делдалдың осы хост атауы үшін жасаған сертификаты болуы мүмкін. Оны басқа маршрут арқылы байқалған сертификатпен салыстырғанда осы айырмашылықты сақтаңыз.

Қатысты мақалалар