قراءة شهادة النظير TLS عبر وسيط HTTP في Python
استخدم دعم النفق في HTTPConnection في Python قبل تغليف المقبس بسياق SSL يتحقق من الشهادة.
لا يتفاوض 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 الموثوق، قد تكون شهادة النظير شهادة أنشأها الوسيط لهذا المضيف. حافظ على هذا التمييز عند مقارنتها بشهادة لوحظت عبر مسار آخر.