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 מהימן, תעודת העמית יכולה להיות התעודה שהמתווך יצר עבור שם המארח הזה. שמרו על ההבחנה הזו כשאתם משווים אותה לתעודה שנצפתה בנתיב אחר.

מאמרים קשורים