TLS գործընկերոջ վկայականի ընթերցում HTTP վստահված սերվերի միջոցով Python-ում
Օգտագործեք Python-ի HTTPConnection թունելի աջակցությունը նախքան socket-ը վավերացնող SSL համատեքստով փաթաթելը։
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 միջամտության դեպքում գործընկերոջ վկայականը կարող է լինել միջնորդի կողմից այս հոսթի անվան համար ստեղծված վկայականը։ Պահպանեք այդ տարբերությունը, երբ համեմատում եք այն այլ ուղով դիտարկված վկայականի հետ։