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 തടയൽ ഉണ്ടെങ്കിൽ, പിയർ സർട്ടിഫിക്കറ്റ് ഈ ഹോസ്റ്റ്നാമിനായി ഇടനിലക്കാരൻ സൃഷ്ടിച്ച സർട്ടിഫിക്കറ്റ് ആകാം. മറ്റൊരു വഴിയിലൂടെ നിരീക്ഷിച്ച സർട്ടിഫിക്കറ്റുമായി താരതമ്യം ചെയ്യുമ്പോൾ ആ വ്യത്യാസം നിലനിർത്തുക.

അനുബന്ധ ലേഖനങ്ങൾ