import ssl
import urllib3

proxy_tls = ssl.create_default_context(cafile='proxy-roots.pem')
proxy_tls.load_cert_chain('proxy-client.pem', 'proxy-client.key')
origin_tls = ssl.create_default_context()

with urllib3.ProxyManager(
    'https://proxy.example:8443',
    proxy_ssl_context=proxy_tls,
    ssl_context=origin_tls,
    timeout=urllib3.Timeout(connect=5, read=15),
) as http:
    response = http.request('GET', 'https://service.example/data')

Usa i file effettivamente approvati. proxy-roots.pem verifica l intermediario; proxy-client.pem e la sua chiave privata corrispondente identificano questo client presso quell intermediario. origin_tls mantiene la politica di fiducia separata della destinazione.

Lo schema https dell URL del proxy è essenziale per quel primo scambio TLS. Per una destinazione HTTPS, urllib3 invia poi CONNECT all interno della sessione TLS esterna ed esegue il TLS del sito web attraverso il tunnel.

Se il sito web richiede anche un certificato client, mettilo su origin_tls. Riusare l identità del proxy lì autenticherebbe una connessione diversa.

Un normale proxy HTTP che trasporta HTTPS non ha alcun handshake TLS esterno. Un ulteriore 407 HTTP è anch esso separato: fornire un certificato client non fornisce credenziali nome utente/password.

Articoli correlati