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 ئۈچۈن ياسىغان گۇۋاھنامىسى بولۇشى مۇمكىن. ئۇنى باشقا يول ئارقىلىق كۆزەتكەن گۇۋاھنامە بىلەن سېلىشتۇرغاندا بۇ پەرقنى ساقلاڭ.

مۇناسىۋەتلىك ماقالىلەر