2012-04-02 27 views
4

SSPIインターフェイスを使用してTLSハンドシェイクプロセスを実装する必要があります。
私のアプリは、クライアント側を実装し、私はhereから見たように、一般的な流れは以下のとおりです。InitializeSecurityContext(Schannel)によるTLSハンドシェイクプロセス

  1. InitializeSecurityContextの - 最初の呼び出しがSecBufferDesc構造体へのポインタを返します。
  2. を呼び出して、出力バッファで(= WinSock API)関数を送信します。
  3. recv関数を呼び出す
  4. バッファを使用して再度InitializeSecurityContextを呼び出します。

これらのバッファに関するMSDN説明:

「最初の呼び出しの後に、この関数の呼び出しでは、2つの のバッファが存在しなければならない最初はSECBUFFER_TOKEN型を持つから受信したトークン が含まれています。 2番目のバッファはSECBUFFER_EMPTYタイプです; は、pvBufferメンバーとcbBufferメンバーの両方をゼロに設定します。

私の質問:

  1. 私はいくつかのより多くの説明が必要:バッファの意味は何ですか? 2番目のバッファには何が含まれていますか?それらは何のため?
  2. MSDNには、InitializeSecurityContext関数のTargetDataRep入力パラメータがSchannelにナットとして使用されていると書かれていますが、見たサンプルの多くはSECURITY_NATIVE_DREPに設定されています。 SECURITY_NATIVE_DREPフラグは何ですか?なぜMSDNはゼロに設定すると言いますか?

本当にありがとうございます。
ありがとうございます。

答えて

3

1. SChannelは、安全なチャネルを介してデータバッファを転送できる抽象化レイヤを提供します。このAPIは、データを送信するときに、実際のデータ(ペイロード)とセキュアチャネルトークン/コンテキストを保持する第2のバッファの2つのデータバッファを提供するように設計されています。このバッファは、プッシュスルーしているすべてのペイロードバッファに接続するものとします。 APIが内部的にこのデータを保持し管理するように設計されていないためです。ハンドル付き。

2.InitializeSecurityContext他のシナリオでは、このパラメータを使用すると、おそらくサンプルコードでは、あなたが別のパッケージに関連したものを見る機会があった、またはそこからコピーまたは両方に適用され、SChannelのパッケージにするだけでなく適用されます。

+0

ありがとうございました! 1.ハンドシェイクループ中にこれらのバッファの内容の例を教えてください。 (プロセスのある時点の内容がどれほど大きくなるかの例)。 2. [this](http://msdn.microsoft.com/en-us/library/aa918273.aspx)MSDN SSPI(Schannel)コードサンプルでは、​​SECURITY_NATIVE_DREPが設定されています。それは間違いですか? – RRR

+0

1 - 最初の 'InitializeSecurityContext'呼び出しでは、トークンを保持するための空の' SECBUFFER_TOKEN'バッファーを出力します。これは、このサイトのSECURITY_NATIVE_DREPフラグを調べることでわかります。'SEC_I_CONTINUE_NEEDED'を受け取ると、あなたはトークン出力バッファにあるデータを相手に送り、応答してデータを受け取って、受け取ったデータを含む' SECBUFFER_TOKEN'バッファを提供する別の 'InitializeSecurityContext'呼び出しを行います。 'SEC_I_CONTINUE_NEEDED'という結果がもう一度得られれば、トークンデータをリモートパーティーに送り、応答を受け取ってSChannel APIに送り、初期化を続行します。 –

+0

2 - 'SECURITY_NATIVE_DREP'が間違いであるかどうかわかりません。このフラグは必須ではないようで、APIはそれを無視します。私はドキュメントに固執し、実際のコードから削除します。 –

関連する問題