- PR -

プロキシを通したhttps通信開始時のSSL通信はどのタイミングから?

1
投稿者投稿内容
posca
会議室デビュー日: 2007/11/12
投稿数: 5
投稿日時: 2007-11-13 02:48
お世話になります。

CONNECTメソッドによってプロキシを通したhttps通信についてなのですが、
SSL通信の開始は一体いつのタイミングからなのでしょうか?

このパケットは一般的なクライアント、プロキシ間なのですが、
***********************************************
CONNECT xxx.xxx.xxx.xxx:443 HTTP/1.0 C>S
HTTP/1.0 200 connection established S>C
CLIENT HELLO C>S
以下SSLハンドシェーク
***********************************************
のようになっています。

RFC2817(http://www21.ocn.ne.jp/~k-west/SSLandTLS/rfc2817-Ja.txt)によると
******************************************************
5.3 CONNECTを使用したトンネルの確立

CONNECTリクエストに対する成功(2xx)レスポンスは、プロキシがリクエスト
されたホストとポートでコネクションを確立したことを示すものであり、また
現在のコネクションをサーバへのコネクションにトンネリングするようスイッチ
したことを示す。
*******************************************************
とあり、2xxレスポンスを受け取った後、コネクションが確立するようです。
これは、HTTP/1.0 200 connection establishedを受信した後、SSL通信を開始するのでしょうか?
それとも、クライアントがCONNECTメソッドを送信した後は、SSL通信は始まっているのでしょうか?

よろしくお願いします。
未記入
ぬし
会議室デビュー日: 2004/09/17
投稿数: 667
投稿日時: 2007-11-13 08:54
HTTPプロキシはSSL通信をおこないませんよ。ただトンネリングするだけです。HTTPプロキシはクライアントから CONNECT メソッドを受け取ると、対象ホストに接続します。このときは接続するだけで何もデータを送信しません。(GET メソッドを受け取った場合は、GET メソッドを上流に送信しますよね? CONNECT の場合は接続するだけで、上流と HTTP通信をおこなったりはしません。) 上流に接続したあと、クライアントに 200 応答を返します。

その後は、HTTPプロキシはクライアントから受信したバイト列をそのまま上流に送信し、上流から受信したバイト列はクライアントにそのまま送信します。流れているデータの内容については一切関知しません。HTTPヘッダを解析したり、ましてやHTTPかどうかさえ気にしません。つまり、HTTPプロキシはソケットの接続を代行して送受信データを横流ししているだけです。

ということで、SSL通信の開始はトンネル確立後、クライアントが CLIENT HELLO を送信したときから開始されるということになります。これは HTTPプロキシうんぬんは関係なく、CLIENT HELLO が SSL ハンドシェイクの最初のシーケンスだからです。
posca
会議室デビュー日: 2007/11/12
投稿数: 5
投稿日時: 2007-11-14 05:41
返信ありがとうございます。

はい、Client HelloはSSL HANDSHAKEの開始パケットですよね。

200応答を受け取ってから、SSL通信は開始なんですね。
いろいろ探してみたのですが、「200を受け取ってからSSL通信が始まる。」的なことを
書いているところが見当たらなくて、不安になってました。

要は******************************************
CONNECT xxx.xxx.xxx.xxx:443 HTTP1.0 C>S
Client Hello C>S
HTTP/1.0 200 connection established S>C
以下SSL HANDSHAKE(Server Hello等)
**********************************************

ってなることは、ありえないのかな?と、考えてました。
このようなことはありえないですよね?

もし、おわかりでしたら、よろしくお願いします。
未記入
ぬし
会議室デビュー日: 2004/09/17
投稿数: 667
投稿日時: 2007-11-14 09:16
ありえないというのは、200 応答が返ってくるまえにクライアントが CLIENT HELLO をサーバーに送信することがあるかどうかってことですか?

・・・どうなんでしょうね。トンネルが確立したかどうか分からない段階で、データを送信するのは非常に行儀が悪いとは思いますけど。実際のところ、サーバー応答前に CLIENT HELLO を送信しても正しく動作しますから。

HTTP で Keep-Alive が有効になっている場合は、パイプライン機能というのが利用できてサーバーの応答を待たずに、リクエストを連続送信することができます。たとえば、GET メソッドを 3つ連続で send して、その後、サーバーからの応答を 3つ read することができます。

高速化のために、このパイプライン機能を悪用して、CONNECT メソッド、CLIENT HELLO を連続送信するクライアントがあってもおかしくないかも。サーバーが 200 応答を返せば正しく動作するし、サーバーが 200 応答を返さなかった場合でも CLIENT HELLO が次の HTTP リクエストとして解釈される(そんなメソッドないよというエラーになる)だけで、不都合はないといえばないです。
posca
会議室デビュー日: 2007/11/12
投稿数: 5
投稿日時: 2007-11-15 02:25
ほぅほぅ、技術的には可能ってことですね。
詳しい説明ありがとうございます。

このようなパケットをちらほら見たのでいろいろと考えてしまいました。
おかげで悩みが解決できそうです。
ありがとうございました。
1

スキルアップ/キャリアアップ(JOB@IT)