อ่านใบรับรอง TLS peer ผ่าน HTTP proxy ใน Python
ใช้การรองรับอุโมงค์ของ HTTPConnection ใน Python ก่อนห่อ socket ด้วย SSL context ที่ตรวจสอบ
ssl.get_server_certificate ไม่เจรจากับ HTTP proxy ให้สร้างอุโมงค์ก่อน จากนั้นทำ TLS ด้วยชื่อโฮสต์ปลายทางและรับใบรับรอง peer
สำหรับ HTTP proxy ที่ไม่ต้องยืนยันตัวตน โดยใช้โฮสต์และพอร์ตของผู้สมัครจากรายการ HTTP proxy:
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 context จะตรวจสอบห่วงโซ่และตัวตนของปลายทางก่อนคืนใบรับรอง ไม่ต้องมี HTTP GET ไปยังปลายทางสำหรับการจับมือนี้
หากสภาพแวดล้อมใช้ CA ส่วนตัวที่ได้รับอนุมัติ ให้โหลด CA นั้นเข้าสู่ context แทนการปิดการตรวจสอบ ห่วงโซ่ที่ถูกปฏิเสธจะทำให้การจับมือที่แสดงล้มเหลว
getpeercert คืนใบรับรองใบของ peer ไม่ใช่ห่วงโซ่ครบถ้วนที่ส่งออกอัตโนมัติ เมื่อมีการดักจับ TLS ที่เชื่อถือได้ ใบรับรอง peer อาจเป็นใบรับรองที่ตัวกลางสร้างขึ้นสำหรับชื่อโฮสต์นี้ รักษาความแตกต่างนั้นไว้เมื่อเปรียบเทียบกับใบรับรองที่สังเกตผ่านเส้นทางอื่น