プロキシサーバーを介したHTTPS接続の仕組み:CONNECTメソッド

プロキシサーバーを介した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 メソッドですが、接続の確立に特化しています。動作の流れは以下の通りです:

  1. クライアントがプロキシサーバーに CONNECT リクエストを送信:

    CONNECT example.com:443 HTTP/1.1
    Host: example.com
    Proxy-Connection: keep-alive
  2. プロキシサーバーはリクエストを受信後、対象サーバーとの TCP 接続を確立し、クライアントに応答を返します:

    HTTP/1.1 200 Connection established

    プロキシサーバーは通常、CONNECT リクエスト自体を対象サーバーに転送しません

  3. その後、プロキシサーバーは透過的な 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 つの接続をブリッジ