អានវិញ្ញាបនបត្រ TLS peer តាមរយៈ HTTP proxy ក្នុង Python
ប្រើការគាំទ្រផ្លូវរូងក្រោមដីរបស់ HTTPConnection ក្នុង Python មុនពេលរុំ socket ក្នុង SSL context ដែលផ្ទៀងផ្ទាត់។
ssl.get_server_certificate មិនចរចាជាមួយ HTTP proxy ទេ។ បង្កើតផ្លូវរូងក្រោមដីជាមុនសិន បន្ទាប់មកធ្វើ TLS ជាមួយឈ្មោះ host គោលដៅ ហើយទទួលបានវិញ្ញាបនបត្រ peer។
សម្រាប់ HTTP proxy ដែលគ្មានការផ្ទៀងផ្ទាត់ ដោយប្រើ host និង port របស់បេក្ខជនពី បញ្ជី HTTP proxy:
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 អាចជាវិញ្ញាបនបត្រដែលអ្នកកណ្តាលបង្កើតសម្រាប់ឈ្មោះ host នេះ។ រក្សាភាពខុសគ្នានោះ នៅពេលប្រៀបធៀបវាជាមួយវិញ្ញាបនបត្រដែលសង្កេតឃើញតាមផ្លូវផ្សេង។