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

Առնչվող հոդվածներ