ssl.get_server_certificate nuk negocion një proxy HTTP. Vendosni së pari tunelin, pastaj kryeni TLS me emrin e hostit të destinacionit dhe merrni certifikatën peer.

Për një proxy HTTP pa autentikim, duke përdorur hostin dhe portin e një kandidati nga lista e proxy-ve 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 trajton kërkesën CONNECT dhe përgjigjen e saj. Më pas konteksti SSL verifikon zinxhirin dhe identitetin e destinacionit përpara se certifikata të kthehet. Nuk kërkohet asnjë HTTP GET drejt destinacionit për këtë shtrëngim duarsh.

Nëse mjedisi përdor një CA private të miratuar, ngarkoni atë CA në kontekst në vend që të çaktivizoni verifikimin. Një zinxhir i refuzuar e bën shtrëngimin e duarve të treguar të dështojë.

getpeercert kthen certifikatën gjethe të peer-it, jo një zinxhir të plotë të eksportuar automatikisht. Me përgjim TLS të besueshëm, certifikata peer mund të jetë certifikata e gjeneruar nga ndërmjetësi për këtë emër hosti. Ruani atë dallim kur e krahasoni me një certifikatë të vëzhguar përmes një rruge tjetër.

Artikuj të ngjashëm