4

我必须使用 SSPI 接口实现 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 说将其设置为零?

我将非常感谢任何帮助。
谢谢!。

4

1 回答 1

3

1.SChannel 为您提供了一个抽象层,以便能够通过安全通道传输数据缓冲区。API 的设计方式是,当您发送一条数据时,您提供两个数据缓冲区 - 实际数据(有效负载)和保存安全通道令牌/上下文的第二个缓冲区。假设您将将此缓冲区附加到您正在推送的每个有效负载缓冲区,例如,因为 API 不是设计的,所以在内部保存和管理这些数据,例如使用句柄。

2. InitializeSecurityContext不仅适用于 SChannel 包,在其他情况下使用此参数,也许您有机会看到与不同包相关的示例代码,或从那里复制或适用于两者。

于 2012-04-03T13:31:04.867 回答