47

だから私は次のシナリオを実装しようとしています:

  • アプリケーションは基本認証によって保護されています。それがホストされているとしましょうapp.com
  • アプリケーションの前にあるHTTPプロキシにも、認証が必要です。それはでホストされていますproxy.com

したがって、ユーザーは同じリクエストでプロキシとアプリケーションの両方の資格情報を提供する必要があります。したがって、ユーザーは異なるユーザー名とパスワードのペアを持っています。1つのペアはアプリケーションに対して自分自身を認証し、もう1つのユーザー名/パスワードのペアはプロキシに対して自分自身を認証します。

仕様を読んだ後、これをどのように実装すべきかよくわかりません。私がやろうと思っていたのは:

  1. ユーザーは、認証なしでプロキシにHTTPリクエストを送信します。
  2. プロキシは応答し、次の形式のヘッダー407 Proxy Authentication Requiredを返します。質問:このヘッダーは正しく設定されていますか?Proxy-Authenticate"Proxy-Authenticate: Basic realm="proxy.com"
    Proxy-Authenticate
  3. 次に、クライアントはProxy-Authorizationヘッダー(プロキシのBase64表現)を使用してリクエストを再試行しますusername:password
  4. 今回はプロキシがリクエストを認証しますが、アプリケーションは401 Unauthorizedヘッダーで応答します。ユーザーはプロキシによって認証されましたが、アプリケーションによっては認証されていません。WWW-Authenticateアプリケーションは、のようなヘッダーを応答に追加しますWWW-Authenticate: Basic realm="app.com"質問:このヘッダー値は正しいですか?
  5. クライアントは、ヘッダーと、アプリのBase64表現で評価されProxy-Authorizationたヘッダーの両方を使用してリクエストを再試行します。Authorizationusername:password
  6. この時点で、プロキシはリクエストを正常に認証し、ユーザーも認証するアプリケーションにリクエストを転送します。そして、クライアントは最終的に応答を返します。

ワークフロー全体は正しいですか?

4

1 に答える 1

31

はい、それはあなたが説明した状況に対して有効なワークフローのように見えます、そしてそれらのAuthenticateヘッダーは正しいフォーマットにあるようです。

可能性は低いですが、特定の接続に複数のプロキシが含まれている可能性があり、それぞれが認証を必要とする可能性があることに注意してください。この場合、各中間プロキシのクライアント側はそれ自体がメッセージを返し、それ自体がヘッダー407 Proxy Authentication Requiredを使用して要求を繰り返します。およびヘッダーはProxy-Authorization、あるサーバーから次のサーバーに渡されないシングルホップヘッダーですが、クライアントから最終サーバーに渡されると見なされ、仲介者によって逐語的に渡されるエンドツーエンドのヘッダーです。Proxy-AuthenticateProxy-AuthorizationWWW-AuthenticateAuthorization

スキームはパスワードを平文で送信するためBasic(base64は可逆エンコーディングです)、SSLを介して最も一般的に使用されます。このシナリオは別の方法で実装されます。これは、プロキシが最終サーバーに送信されたパスワードを認識しないようにすることが望ましいためです。

  • クライアントはプロキシへのSSLチャネルを開いてリクエストを開始しますが、通常のHTTPリクエストを送信する代わりに、リモートサーバーへのTCPトンネルを開くための特別なCONNECTリクエスト(ヘッダー付き)を送信します。Proxy-Authorization
  • 次に、クライアントは最初のSSLチャネル内にネストされた別のAuthorizationSSLチャネルの作成に進み、その上でヘッダーを含む最終的なHTTPメッセージを転送します。

このシナリオでは、プロキシはクライアントが接続されているホストとポートのみを認識し、内部SSLチャネルを介して送受信されたものは認識しません。さらに、ネストされたチャネルを使用すると、クライアントはプロキシとサーバーの両方のSSL証明書を「確認」できるため、両方のIDを認証できます。

于 2013-03-22T03:56:14.313 に答える