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 кийлигишүүсүндө өнөктөш сертификаты ортомчу тарабынан ушул хост аты үчүн түзүлгөн сертификат болушу мүмкүн. Аны башка маршрут аркылуу байкалган сертификат менен салыштырганда ушул айырманы сактаңыз.

Тектеш макалалар