
プロキシサーバーを介したHTTPS接続の仕組み:CONNECTメソッド
HTTP プロキシを使用してネットワークに接続する場合、プロキシサーバーはクライアントのリクエストを転送します。しかし、HTTPS は最初に TLS ハンドシェイクが必要なため、プロキシサーバーはリクエストを直接転送することができず、まず接続を確立する必要があります。
HTTP プロキシのリクエスト転送
プロキシサーバーは HTTP 接続(TLS 暗号化されていないもの)を簡単に処理します。例えば、クライアントが example.com にアクセスしたい場合、以下のリクエストを送信します:
GET http://example.com/index.html HTTP/1.1
Host: example.com
User-Agent: Mozilla/5.0
Proxy-Connection: keep-alive
このリクエストは最初にプロキシサーバーを通過します。プロキシは対象 URL を解析し、その後リクエストを完全に転送します。レスポンスを受信した後、クライアントに転送します。
HTTPS 接続
TLS 暗号化が追加されると、問題は複雑になります。プロキシサーバーはクライアントのリクエストを直接転送することができません。これは、クライアントに代わってサーバーとの TLS 接続を確立できないためです。もしそうした場合、クライアントは TLS 証明書エラーを検出するでしょう。
CONNECT メソッドがこの問題を解決します。GET と同様に HTTP メソッドですが、接続の確立に特化しています。動作の流れは以下の通りです:
-
クライアントがプロキシサーバーに CONNECT リクエストを送信:
CONNECT example.com:443 HTTP/1.1 Host: example.com Proxy-Connection: keep-alive
-
プロキシサーバーはリクエストを受信後、対象サーバーとの TCP 接続を確立し、クライアントに応答を返します:
HTTP/1.1 200 Connection established
プロキシサーバーは通常、CONNECT リクエスト自体を対象サーバーに転送しません
-
その後、プロキシサーバーは透過的な TCP トンネルとなり、TCP パケットを盲目的に転送します。この時点で、クライアントは TLS ハンドシェイクを実行し、HTTPS データを送信できます。データは暗号化されているため、プロキシサーバーは通信内容を閲覧または変更することができません。
sequenceDiagram participant Client participant Proxy participant Server Client->>Proxy: CONNECT example.com:443 Proxy->>Server: TCP Connection Server->>Proxy: Connection Established Proxy->>Client: HTTP/1.1 200 Connection established Note over Client,Server: TLS Handshake Note over Client,Server: Encrypted Communication
上記のプロセスから、CONNECT メソッドは実際には TCP トンネルを確立し、TLS 専用に設計されたものではないことがわかります。したがって、このトンネルを通じて任意の TCP リクエストを送信することができます。
トランスポート層プロキシは CONNECT メソッドを必要とするか?
SOCKS5 プロキシなどのトランスポート層(TCP/UDP)で動作するプロキシは、CONNECT メソッドを必要としません。これは、TCP と UDP 接続を直接処理し、アプリケーション層プロトコル(HTTP など)を理解する必要がないためです。
クライアントがこれらのプロキシを通じて HTTPS ウェブサイトに接続する場合、プロキシサーバーは以下のことだけを行う必要があります:
- クライアントの接続リクエストを受信
- 対象サーバーとの TCP 接続を確立
- 2 つの接続をブリッジ