2012-04-02 82 views
4

我必須使用SSPI接口實現TLS握手過程。
我的應用程序實現了客戶端,並且我從here看到的一般流程是:通過InitializeSecurityContext(Schannel)的TLS握手過程

  1. 的InitializeSecurityContext - 第一次調用返回一個指針SecBufferDesc結構。
  2. 致電用輸出緩衝區發送(= WinSock API)函數。
  3. 調用recv函數
  4. 再次調用InitializeSecurityContext與緩衝區。

MSDN解釋這些緩衝區:

「在呼叫初始調用該功能後,必須有兩個 緩衝第一有類型SECBUFFER_TOKEN,包含從接收的令牌 。第二個緩衝區的類型爲SECBUFFER_EMPTY; 將pvBuffer和cbBuffer成員設置爲零。「

我的問題:

  1. 我需要一些更多的解釋:什麼是緩衝區的含義是什麼?第二個緩衝區包含什麼?他們有什麼用途?
  2. 在MSDN中,編寫了InitializeSecurityContext函數的TargetDataRep輸入參數是用於Schannel的,但我看到的很多示例都將它設置爲SECURITY_NATIVE_DREP。什麼是SECURITY_NATIVE_DREP標誌?爲什麼MSDN要求將其設置爲零?

我會真的很感謝任何幫助。
謝謝!

回答

3

1. SChannel爲您提供了一個抽象層,可以通過安全通道傳輸數據緩衝區。 API的設計方式是當您發送一段數據時,您提供兩個數據緩衝區 - 實際數據(有效負載)和保存安全通道令牌/上下文的第二個緩衝區。假設你將這個緩衝區附加到你要通過的每個有效負載緩衝區,例如因爲API沒有設計在內部保存和管理這些數據,例如與句柄。

2.InitializeSecurityContext不僅適用於SChannel中的包,在其他情況下使用此參數,也許示例代碼,你有機會看到相關的不同的包,或從那裏複製或適用於兩個。

+0

謝謝! 1.你能舉個例子來說明握手循環期間這些緩衝區的內容嗎? (舉例說明過程中某個時刻的內容會很棒)。 2.在[this](http://msdn.microsoft.com/zh-cn/library/aa918273.aspx)MSDN SSPI(Schannel)代碼示例中,設置了SECURITY_NATIVE_DREP。這是錯誤的嗎? (你可以通過在這個站點中快速搜索SECURITY_NATIVE_DREP標誌來找到它) – RRR 2012-04-04 06:55:49

+0

1 - 在第一個'InitializeSecurityContext'調用中,你提供一個輸出空的'SECBUFFER_TOKEN'緩衝區來保存令牌。收到'SEC_I_CONTINUE_NEEDED'後,您將令牌輸出緩衝區中的數據發送給遠程參與方,您將接收到數據並作出響應,併爲接收到的數據進行另一個'InitializeSecurityContext'調用,以提供輸入'SECBUFFER_TOKEN'緩衝區。如果再次獲得SEC_I_CONTINUE_NEEDED結果,則重複整個過程 - 將令牌數據發送給遠程方,接收響應並再次將其提供給SChannel API以繼續初始化。 – 2012-04-04 07:01:48

+0

2 - 我不確定SECURITY_NATIVE_DREP是否是一個錯誤。它看起來像這個標誌不是必需的,API忽略它。我會堅持文檔並將其從實際代碼中移除。 – 2012-04-04 07:03:27