Python లో HTTP ప్రాక్సీ ద్వారా TLS పీర్ సర్టిఫికెట్ చదవండి
సాకెట్ను ధృవీకరించే SSL సందర్భంలో చుట్టడానికి ముందు Python యొక్క HTTPConnection టన్నెల్ మద్దతును ఉపయోగించండి.
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 అడ్డగింపుతో, పీర్ సర్టిఫికెట్ ఈ హోస్ట్నామ్ కోసం మధ్యవర్తి సృష్టించిన సర్టిఫికెట్ కావచ్చు. మరొక మార్గంలో గమనించిన సర్టిఫికెట్తో పోల్చినప్పుడు ఆ భేదాన్ని కాపాడండి.