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 នេះ។ រក្សាភាពខុសគ្នានោះ នៅពេលប្រៀបធៀបវាជាមួយវិញ្ញាបនបត្រដែលសង្កេតឃើញតាមផ្លូវផ្សេង។

អត្ថបទពាក់ព័ន្ធ