Use contextos TLS separados para el proxy y el sitio web de urllib3
Cargue el certificado de cliente del proxy HTTPS en proxy_ssl_context, y deje la confianza del destino y cualquier identidad de cliente del destino en ssl_context.
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')Use los archivos aprobados reales. proxy-roots.pem verifica el intermediario; proxy-client.pem y su clave privada correspondiente identifican este cliente ante ese intermediario. origin_tls mantiene la política de confianza separada del destino.
El esquema https de la URL del proxy es esencial para ese primer intercambio TLS. Para un destino HTTPS, urllib3 envía entonces CONNECT dentro de la sesión TLS externa y realiza el TLS del sitio web a través del túnel.
Si el sitio web también exige un certificado de cliente, colóquelo en origin_tls. Reutilizar allí la identidad del proxy autenticaría una conexión distinta.
Un proxy HTTP normal que transporta HTTPS no tiene ningún handshake TLS externo. Un 407 HTTP adicional también es independiente: aportar un certificado de cliente no suministra credenciales de usuario/contraseña.