ssl.get_server_certificate semur ekki við HTTP-milliþjón. Koma fyrst á tunnlinum, framkvæmið síðan TLS með hýsisheiti áfangastaðar og sækið jafningjavottorðið.

Fyrir HTTP-milliþjón án auðkenningar, með hýsil og porti frambjóðanda úr HTTP-milliþjónalistanum:

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 sér um CONNECT-beiðnina og svarið við henni. SSL-samhengið staðfestir síðan keðjuna og auðkenni áfangastaðar áður en vottorðið er skilað. Engin HTTP GET til áfangastaðar er nauðsynleg fyrir þessa handabandi.

Ef umhverfið notar samþykkt einkarekið CA, hlaðið því CA inn í samhengið í stað þess að slökkva á staðfestingu. Hafnaðri keðju veldur því að sýnt handaband mistekst.

getpeercert skilar blaðvottorði jafningsins, ekki sjálfvirkt útfluttri fullri keðju. Með treystri TLS-hlerun getur jafningjavottorðið verið vottorðið sem milliliðurinn bjó til fyrir þetta hýsisheiti. Varðveitið þann mun þegar það er borið saman við vottorð sem sést hefur á annarri leið.

Tengdir greinar