ssl.get_server_certificate HTTP proksi bilan muzokara qilmaydi. Avval tunnelni quring, so'ng manzil host nomi bilan TLS bajaring va hamkor sertifikatini oling.

Autentifikatsiyasiz HTTP proksi uchun HTTP proksilar ro'yxatidan nomzodning host va portidan foydalanib:

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 so'rovini va uning javobini boshqaradi. So'ng SSL konteksti sertifikat qaytarilishidan oldin zanjir va manzilning kimligini tekshiradi. Bu qo'l siqish uchun manzilga HTTP GET talab qilinmaydi.

Agar muhit tasdiqlangan xususiy CA'dan foydalansa, tekshirishni o'chirish o'rniga o'sha CA'ni kontekstga yuklang. Rad etilgan zanjir ko'rsatilgan qo'l siqishni muvaffaqiyatsiz qiladi.

getpeercert hamkorning barg sertifikatini qaytaradi, avtomatik eksport qilingan to'liq zanjirni emas. Ishonchli TLS aralashuvida hamkor sertifikati vositachi tomonidan bu host nomi uchun yaratilgan sertifikat bo'lishi mumkin. Uni boshqa marshrut orqali kuzatilgan sertifikat bilan solishtirganda bu farqni saqlang.

O'xshash maqolalar