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، گواهی همتا می‌تواند گواهی ساخته‌شده توسط واسطه برای این نام میزبان باشد. این تفاوت را هنگام مقایسه با گواهی مشاهده‌شده از مسیر دیگر حفظ کنید.

مقالات مرتبط