ssl.get_server_certificate သည် HTTP proxy နှင့် ညှိနှိုင်းခြင်းမပြုပါ။ ဦးစွာ tunnel ကို တည်ဆောက်ပြီး ထို့နောက် ဦးတည်ရာ hostname ဖြင့် TLS လုပ်ကာ peer လက်မှတ်ကို ရယူပါ။

အတည်ပြုခြင်းမရှိသော HTTP proxy အတွက် HTTP proxy စာရင်းမှ ကိုယ်စားလှယ်လောင်း၏ 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 context သည် လက်မှတ် မပြန်မီ ကွင်းဆက်နှင့် ဦးတည်ရာ၏ အထောက်အထားကို စစ်ဆေးသည်။ ဤလက်ဆွဲနှုတ်ဆက်မှုအတွက် ဦးတည်ရာသို့ HTTP GET မလိုအပ်ပါ။

ပတ်ဝန်းကျင်သည် အတည်ပြုထားသော ကိုယ်ပိုင် CA ကို အသုံးပြုပါက စစ်ဆေးခြင်းကို ပိတ်မည့်အစား ထို CA ကို context ထဲသို့ တင်ပါ။ ငြင်းပယ်ခံရသော ကွင်းဆက်သည် ပြသထားသော လက်ဆွဲနှုတ်ဆက်မှုကို မအောင်မြင်စေပါ။

getpeercert သည် peer ၏ အရွက်လက်မှတ်ကို ပြန်ပေးသည်၊ အလိုအလျောက် ထုတ်ယူထားသော ကွင်းဆက်အပြည့် မဟုတ်ပါ။ ယုံကြည်ရသော TLS ကြားဖြတ်ခြင်းဖြင့် peer လက်မှတ်သည် ဤ hostname အတွက် ကြားခံက ဖန်တီးထားသော လက်မှတ် ဖြစ်နိုင်သည်။ အခြားလမ်းကြောင်းမှ တွေ့ရှိသော လက်မှတ်နှင့် နှိုင်းယှဉ်သောအခါ ထို ကွာခြားချက်ကို ထိန်းသိမ်းပါ။

ဆက်စပ်ဆောင်းပါးများ