urllib3 のプロキシと Web サイトに別々の TLS コンテキストを使う
HTTPS プロキシのクライアント証明書を proxy_ssl_context に読み込み、宛先の信頼と宛先のクライアント ID は 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 を送信し、トンネル経由で Web サイトの TLS を実行します。
Web サイトもクライアント証明書を要求する場合は、それを origin_tls に置きます。そこにプロキシの ID を再利用すると、別の接続を認証することになります。
HTTPS を運ぶ通常の HTTP プロキシには外側の TLS ハンドシェイクはありません。追加の HTTP 407 も別物です。クライアント証明書を提供しても、ユーザー名/パスワードの資格情報は供給されません。