Membaca Sijil Rakan TLS Melalui Proksi HTTP dalam Python
Gunakan sokongan terowong HTTPConnection Python sebelum membalut soket dengan konteks SSL yang mengesahkan.
ssl.get_server_certificate tidak berunding dengan proksi HTTP. Bina terowong dahulu, kemudian lakukan TLS dengan nama hos destinasi dan dapatkan sijil rakan.
Untuk proksi HTTP tanpa pengesahan, menggunakan hos dan port calon daripada senarai proksi 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 mengendalikan permintaan CONNECT dan responsnya. Konteks SSL kemudian mengesahkan rantai dan identiti destinasi sebelum sijil dikembalikan. Tiada HTTP GET ke destinasi diperlukan untuk jabat tangan ini.
Jika persekitaran menggunakan CA peribadi yang diluluskan, muatkan CA itu ke dalam konteks dan bukannya mematikan pengesahan. Rantai yang ditolak menyebabkan jabat tangan yang ditunjukkan gagal.
getpeercert mengembalikan sijil daun rakan, bukan rantai lengkap yang dieksport secara automatik. Dengan pemintasan TLS yang dipercayai, sijil rakan boleh menjadi sijil yang dijana oleh perantara untuk nama hos ini. Kekalkan perbezaan itu apabila membandingkannya dengan sijil yang diperhatikan melalui laluan lain.