web-dev-qa-db-ja.com

HTTP Proxy ServerでいつCONNECTおよびGET HTTPメソッドを使用する必要がありますか?

WebClientライブラリを構築しています。現在、プロキシ機能を実装しているため、調査を行っており、CONNECTメソッドを使用してURLを要求するコードを見ました。

しかし、私のWebブラウザー内で確認すると、CONNECTメソッドは使用されず、代わりにGETメソッドが呼び出されます。

だから私は混乱しています。両方の方法を使用する必要がある場合

49
Alexsandro

CONNECT要求は、プロキシがリモートエンドポイントへのHTTPトンネルを確立するように促します。 通常はSSL接続に使用されますが、HTTPでも使用できます(プロキシチェーンとトンネリングの目的で使用されます)

CONNECT www.google.com:443 

上記の行は、ポート443でプロキシからwww.google.comへの接続を開きます。この後、クライアントから送信されたコンテンツは、プロキシによってwww.google.com:443

ユーザーがページを取得しようとした場合 http://www.google.com 、プロキシはまったく同じリクエストを送信し、ユーザーに代わってレスポンスを取得できます。

SSL(HTTPS)では、2つのリモートエンドポイントのみがリクエストを理解し、プロキシはそれらを解読できません。したがって、CONNECTを使用してそのトンネルを開き、2つのエンドポイント(Webサーバーとクライアント)が互いに直接通信できるようにします。

プロキシチェーン:

2つのプロキシサーバーをチェーンしている場合、これは発行される要求のシーケンスです。

GET1 is the original GET request (HTTP URL)
CONNECT1 is the original CONNECT request (SSL/HTTPS URL or Another Proxy)

User Request ==CONNECT1==> (Your_Primary_Proxy ==CONNECT==> AnotherProxy-1 ... ==CONNECT==> AnotherProxy-n) ==GET1(IF is http)/CONNECT1(IF is https)==> Destination_URL
68

TL; DR Webクライアントは、プロキシと通信し、最終URIがhttps://で始まることがわかっている場合にのみCONNECTを使用します。

ブラウザに次のように表示される場合:

CONNECT www.google.com:443 HTTP/1.1

その意味は:

「こんにちはプロキシ、生のTCP googleへの接続を開いてください。私が書いた次のバイトは、何も解釈せずにその接続を繰り返します。もう1つ。直接Googleに送信しますが、自分で別のプロキシを使用する場合は、代わりに同じCONNECTを伝えます。」

これがTLS(https)について何も言っていないことに注意してください。実際、CONNECTはTLSと直交しています。 1つだけ持つことができます、他のものを持つことができます、またはそれらの両方を持つことができます。

そうは言っても、CONNECTの目的はエンドツーエンドの暗号化されたTLSセッションを許可することであるため、プロキシ(またはプロキシチェーン全体)がデータを読み取ることはできません。 CONNECTはプレーンHTTP内で発行でき、プロキシから生のバイトをコピーするだけでよいため、プロキシがTLSをまったく理解していなくても機能します。

ただし、最初のプロキシへの接続はTLS(https)にすることができますが、これはユーザーと最初のプロキシ間のトラフィックの二重暗号化を意味します。

明らかに、最終サーバーと直接通信する場合、CONNECTには意味がありません。 TLSの話を始めてから、HTTP GETを発行します。通常、エンドサーバーはCONNECTを完全に無効にします。

プロキシに対して、CONNECTサポートはセキュリティリスクを追加します。すべてのデータは、CONNECTを介して渡すことができます。sshハッキングが192.168.1。*のサーバーに侵入したり、SMTPがスパムを送信したりすることもあります。外の世界は、これらの攻撃を通常のTCPプロキシによって開始された接続と見なします。理由を気にせず、HTTP CONNECTが原因かどうかをチェックできません。悪用から身を守るためのプロキシまで。

はい、私はこれに4年後に答えていることを知っています、とにかくもっと明確にしたいです。

45
kubanczyk

経験則として、GETはプレーンHTTPに、CONNECTはHTTPSに使用されます

ただし、詳細がありますので、関連するRFCを読んでください。

http://www.ietf.org/rfc/rfc2068.txthttp://www.ietf.org/rfc/rfc2817.txt

20
anttix