为 urllib3 的代理和网站使用独立的 TLS 上下文
把 HTTPS 代理的客户端证书加载到 proxy_ssl_context,让目标信任和任何目标客户端身份留在 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')使用实际获批的文件。proxy-roots.pem 验证中间代理;proxy-client.pem 及其配对的私钥向该中间代理标识本客户端。origin_tls 保留目标单独的信任策略。
代理 URL 的 https 方案对那次首次 TLS 交换至关重要。对于 HTTPS 目标,urllib3 随后在外层 TLS 会话内发送 CONNECT,并通过隧道完成网站 TLS。
如果网站也需要客户端证书,把它放在 origin_tls 上。在那里复用代理身份会认证另一个连接。
承载 HTTPS 的普通 HTTP 代理没有外层 TLS 握手。额外的 HTTP 407 也是另一回事:提供客户端证书并不提供用户名/密码凭据。