Python دا HTTP ۋاكالەتچى ئارقىلىق TLS قوشنا گۇۋاھنامىسىنى ئوقۇش
socket نى دەلىللەيدىغان SSL مۇھىتىغا ئوراشتىن بۇرۇن Python نىڭ HTTPConnection تونېل قوللىشىنى ئىشلىتىڭ.
ssl.get_server_certificate HTTP ۋاكالەتچى بىلەن سۆھبەتلەشمەيدۇ. ئاۋۋال تونېلنى قۇرۇڭ، ئاندىن نىشان hostname بىلەن TLS قىلىپ قوشنا گۇۋاھنامىسىنى ئېلىڭ.
دەلىللەشكە ئېھتىياجى يوق HTTP ۋاكالەتچى ئۈچۈن، HTTP ۋاكالەتچى تىزىملىكىدىن بىر نامزاتنىڭ host ۋە port نى ئىشلىتىپ:
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 ئارىلىشىشىدا، قوشنا گۇۋاھنامىسى ئارىلىقچىنىڭ بۇ hostname ئۈچۈن ياسىغان گۇۋاھنامىسى بولۇشى مۇمكىن. ئۇنى باشقا يول ئارقىلىق كۆزەتكەن گۇۋاھنامە بىلەن سېلىشتۇرغاندا بۇ پەرقنى ساقلاڭ.