4
我必須使用SSPI接口實現TLS握手過程。
我的應用程序實現了客戶端,並且我從here看到的一般流程是:通過InitializeSecurityContext(Schannel)的TLS握手過程
- 的InitializeSecurityContext - 第一次調用返回一個指針SecBufferDesc結構。
- 致電用輸出緩衝區發送(= WinSock API)函數。
- 調用recv函數
- 再次調用InitializeSecurityContext與緩衝區。
的MSDN解釋這些緩衝區:
「在呼叫初始調用該功能後,必須有兩個 緩衝第一有類型SECBUFFER_TOKEN,包含從接收的令牌 。第二個緩衝區的類型爲SECBUFFER_EMPTY; 將pvBuffer和cbBuffer成員設置爲零。「
我的問題:
- 我需要一些更多的解釋:什麼是緩衝區的含義是什麼?第二個緩衝區包含什麼?他們有什麼用途?
- 在MSDN中,編寫了InitializeSecurityContext函數的TargetDataRep輸入參數是用於Schannel的,但我看到的很多示例都將它設置爲SECURITY_NATIVE_DREP。什麼是SECURITY_NATIVE_DREP標誌?爲什麼MSDN要求將其設置爲零?
我會真的很感謝任何幫助。
謝謝!
謝謝! 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
1 - 在第一個'InitializeSecurityContext'調用中,你提供一個輸出空的'SECBUFFER_TOKEN'緩衝區來保存令牌。收到'SEC_I_CONTINUE_NEEDED'後,您將令牌輸出緩衝區中的數據發送給遠程參與方,您將接收到數據並作出響應,併爲接收到的數據進行另一個'InitializeSecurityContext'調用,以提供輸入'SECBUFFER_TOKEN'緩衝區。如果再次獲得SEC_I_CONTINUE_NEEDED結果,則重複整個過程 - 將令牌數據發送給遠程方,接收響應並再次將其提供給SChannel API以繼續初始化。 – 2012-04-04 07:01:48
2 - 我不確定SECURITY_NATIVE_DREP是否是一個錯誤。它看起來像這個標誌不是必需的,API忽略它。我會堅持文檔並將其從實際代碼中移除。 – 2012-04-04 07:03:27