TLS握手过程由InitializeSecurityContext(Schannel)

时间:2012-04-02 09:31:07

标签: c++ winapi sspi handshake schannel

我必须使用SSPI接口实现TLS握手过程 我的应用程序实现了客户端,正如我从here看到的那样,一般流程是:

  1. InitializeSecurityContext - 首先调用返回指向SecBufferDesc结构的指针。
  2. 使用输出缓冲区调用发送(= WinSock API)函数。
  3. 致电recv功能
  4. 使用缓冲区再次调用InitializeSecurityContext。
  5. 关于这些缓冲区的MSDN解释:

      

    “在初次通话后调用此功能时,必须有两个   缓冲区。第一个类型为SECBUFFER_TOKEN并包含令牌   从服务器收到。第二个缓冲区的类型为SECBUFFER_EMPTY;   将pvBuffer和cbBuffer成员都设置为零。“

    我的问题:

    1. 我需要更多解释:缓冲区的含义是什么?第二个缓冲区包含什么?它们的用途是什么?
    2. 在MSDN中写道,InitializeSecurityContext函数的TargetDataRep输入参数是用于Schannel的,但我看到的许多样本都将其设置为SECURITY_NATIVE_DREP。什么是SECURITY_NATIVE_DREP标志?为什么MSDN会说将其设置为零?
    3. 我将非常感谢任何帮助 谢谢!。

1 个答案:

答案 0 :(得分:3)

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

2. InitializeSecurityContext不仅适用于SChannel软件包,在其他情况下也会使用此参数,您可能会使用示例代码查看与其他软件包相关的内容,或者从那里复制或应用两者都有。