ssl.get_server_certificate HTTP proksisi ilə danışıq aparmır. Əvvəlcə tuneli qurun, sonra təyinat hostunun adı ilə TLS yerinə yetirin və həmkar sertifikatını alın.

Autentifikasiya tələb etməyən HTTP proksisi üçün HTTP proksi siyahısından namizədin hostu və portundan istifadə edərək:

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 sorğusunu və ona cavabı idarə edir. Sonra SSL konteksti sertifikat qaytarılmazdan əvvəl zənciri və təyinatın kimliyini yoxlayır. Bu əl sıxışması üçün təyinata HTTP GET tələb olunmur.

Mühit təsdiqlənmiş özəl CA istifadə edirsə, yoxlamanı söndürmək əvəzinə həmin CA-nı kontekstə yükləyin. Rədd edilən zəncir göstərilən əl sıxışmasını uğursuz edir.

getpeercert həmkarın yarpaq sertifikatını qaytarır, avtomatik ixrac edilən tam zənciri deyil. Etibarlı TLS müdaxiləsi ilə həmkar sertifikatı araşdırıcının bu host adı üçün yaratdığı sertifikat ola bilər. Onu başqa marşrutla müşahidə edilən sertifikatla müqayisə edərkən bu fərqi qoruyun.

Əlaqəli məqalələr