1

Web サイトにアクセスするための単純なクライアント ソケット アプリケーションがあります。クライアントがインターネットにアクセスするには、HTTP プロキシ サーバーを経由する必要があります (Microsoft Forefront Threat Management Gateway を使用しています)。プロキシ サーバーは認証を必要とし、GSSAPI 経由で Kerberos を受け入れるように構成されています。

私のクライアントでは、Microsoft の SSPI を使用しています。

まず、成功して返されるAcquireCredentialsHandleを呼び出しますSEC_E_OK

次に、InitializeSecurityContextを呼び出します。これも成功して戻りますSEC_E_OK

ここまでは順調ですね。しかし今、承認のためにトークンをプロキシサーバーに送信する必要があります。これが問題を引き起こしている部分です。

Internet Explorer を使用してプロキシ サーバーに接続すると、Wireshark を介してパケット交換を監視できます。IE は Kerberos とチケットをネゴシエートし、Proxy-Authorization ヘッダーを介して送信するように見えます。ヘッダーの内容は base64 でエンコードされているようです。

から返されたトークンを単に取得し、InitializeSecurityContextそれを base64 エンコードして、結果を のようなヘッダーを介してプロキシ サーバーに送信するとProxy-Authorization: Negotiate <base64Data>、認証は失敗します。

近づいたような気がしますが、まだ何かが欠けています。あるサイトでは、送信前にトークンで EncryptMessage を使用することについて説明していました。相互認証の使用について別の議論がありました (IE が相互認証を使用しているとは思いません。なぜなら、クライアントは認証を 1 回しか送信していないようで、サーバーからのフィードバック データがないためです ( InitializeSecurityContext2 回目に呼び出す)。別のサイトでは、トークンをさまざまなSEC_BUFFERタイプ(パディング、データなど)と暗号化方法に関するドキュメントがあまり見つからないため、これが必要なことだと思います。

洞察や提案をいただければ幸いです。

UPDATE 7/19/2014: 明確にするために、SSPI を使用して「base64Data」フィールドを計算する方法を尋ねています (上記参照)。SECBUFFER_TOKEN のバッファに含まれるコンテンツの base64 エンコーディングを計算することは私の最初の推測でしたが、サーバーは結果を受け入れないため、明らかに無効です。

さらなる調査によると、トークンを「ラップ」する必要があり (別名、SSPI を介して「EncryptMessage」)、GSSAPI と互換性のある方法で暗号化するには、3 つのバッファーを使用する必要があります (順序: SECBUFFER_TOKEN、SECBUFFER_DATA、および SECBUFFER_PADDING)。これは昨日ですが、成功しませんでした。

http://msdn.microsoft.com/en-us/library/ms995352.aspx

http://msdn.microsoft.com/en-us/magazine/cc301890.aspx

4

1 に答える 1

0

プロキシの相互作用を自分でコーディングしますか? Windowsでの使用をお勧めしlibcurlます。これは、TMG が機能している場合に問題なく動作します。

コピー アンド ペーストが失敗する理由は、accept が返信として再送信したことを検出するためです。Kerberos はリプレイプルーフです。チケットを盗んで再利用することはできません。

を呼び出し、InitializeSecurityContext呼び出しが成功するとSEC_E_OKへのポインターを受け取ったとしますSecBufferDesc。含まれている配列にアクセスし、構造体を読み取り、要素PSecBufferにアクセスして、 a にキャストされたものを、 (16 バイト) を base64 から a に変換する関数に渡す必要があります。長さを渡すことを忘れないでください。それからあなたはしません。これは、HTTP プロキシの base64 でエンコードされたチケットです。pvBuffervoid*unsigned char*unsigned char*char*cbBuffer

使用できますEncryptMessageが、HTTP では使用できません。HTTP は TLS を使用します。を使用する場合はEncryptMessage、プレーン ソケットを使用してください。EncryptMessageクライアントとサーバー間のトラフィック全体を透過的に暗号化します。

ところで:私は常に相互認証を照会するため、プロキシはIEにチケットを返します。ケースを実行する必要があります。したがって、 を受け取るまで init コンテキストを調べる必要がありOKますCONTINUE_NEEDED

于 2014-07-18T06:48:50.680 に答える