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 を送信し、トンネル経由で Web サイトの TLS を実行します。

Web サイトもクライアント証明書を要求する場合は、それを origin_tls に置きます。そこにプロキシの ID を再利用すると、別の接続を認証することになります。

HTTPS を運ぶ通常の HTTP プロキシには外側の TLS ハンドシェイクはありません。追加の HTTP 407 も別物です。クライアント証明書を提供しても、ユーザー名/パスワードの資格情報は供給されません。

関連記事