InitializeSecurityContext(Schannel)的TLS握手过程

TLS Handshake process by InitializeSecurityContext (Schannel)

本文关键字:过程 TLS Schannel InitializeSecurityContext      更新时间:2023-10-16

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

  1. InitializeSecurityContext-第一个调用返回指向SecBufferDesc结构的指针
  2. 调用带有输出缓冲区的send(=WinSock API)函数
  3. 调用recv函数
  4. 使用缓冲区再次调用InitializeSecurityContext

MSDN对这些缓冲区的解释:

"在初始调用之后调用此函数时,必须有两个缓冲区。第一个具有SECBUFFER_TOKEN类型,并包含令牌从服务器接收。第二缓冲器具有类型SECBUFFER_EMPTY;将pvBuffer和cbBuffer成员都设置为零。"

我的问题:

  1. 我需要更多的解释:缓冲区的含义是什么?第二个缓冲区包含什么?它们是干什么的
  2. 在MSDN中,InitializeSecurityContext函数的TargetDataRep输入参数被用于Schannel,但我看到的许多示例都将其设置为SECURITY_NAMETIVE_DREP。什么是SECURITY_NAMETIVE_DREP标志?MSDN为什么说要将其设置为零

我真的很感激任何帮助
谢谢

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

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