Python இல் HTTP ப்ராக்ஸி வழியாக TLS peer சான்றிதழைப் படிக்கவும்
சாக்கெட்டை சரிபார்க்கும் SSL சூழலில் சுற்றுவதற்கு முன் Python இன் HTTPConnection சுரங்க ஆதரவைப் பயன்படுத்தவும்.
ssl.get_server_certificate HTTP ப்ராக்ஸியுடன் பேச்சுவார்த்தை நடத்தாது. முதலில் சுரங்கத்தை அமைக்கவும், பிறகு இலக்கு ஹோஸ்ட்பெயருடன் TLS செய்து peer சான்றிதழைப் பெறவும்.
அங்கீகாரம் இல்லாத 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 peer இன் இலைச் சான்றிதழைத் திருப்பித் தருகிறது, தானாக ஏற்றுமதி செய்யப்பட்ட முழு சங்கிலியை அல்ல. நம்பகமான TLS இடையீட்டில், peer சான்றிதழ் இந்த ஹோஸ்ட்பெயருக்காக இடைத்தரகர் உருவாக்கிய சான்றிதழாக இருக்கலாம். வேறு பாதையில் கவனிக்கப்பட்ட சான்றிதழுடன் ஒப்பிடும்போது அந்த வேறுபாட்டைப் பேணவும்.