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 也是另一回事:提供客户端证书并不提供用户名/密码凭据。

相关文章