【问题标题】:TLS Handshake process by InitializeSecurityContext (Schannel)InitializeSecurityContext (Schannel) 的 TLS 握手过程
【发布时间】:2012-04-15 23:14:15
【问题描述】:

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

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

MSDN 关于这些缓冲区的解释:

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

我的问题:

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

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

【问题讨论】:

    标签: c++ winapi sspi handshake schannel


    【解决方案1】:

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

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

    【讨论】:

    • 谢谢!。 1. 你能举个例子说明握手循环期间这些缓冲区的内容吗? (例如在过程中的某个时间点的内容会很棒)。 2. 在this MSDN SSPI(Schannel) 代码示例中,设置了 SECURITY_NATIVE_DREP。是错误吗? (您可以通过在此站点中快速搜索 SECURITY_NATIVE_DREP 标志来找到它)
    • 1 - 在第一个 InitializeSecurityContext 调用中,您提供一个输出为空的 SECBUFFER_TOKEN 缓冲区来保存令牌。收到SEC_I_CONTINUE_NEEDED 后,您将令牌输出缓冲区中的数据发送到远程方,您接收回数据作为响应并进行另一个InitializeSecurityContext 调用,提供输入SECBUFFER_TOKEN 缓冲区与接收到的数据。如果你再次得到SEC_I_CONTINUE_NEEDED 结果,你就重复整个过程——你将令牌数据发送到远程方,接收响应,然后再次将其输入 SChannel API 以继续初始化。
    • 2 - 我不确定SECURITY_NATIVE_DREP 是否是一个错误。看起来这个标志不是必需的,API 会忽略它。我会坚持文档并将其从真实代码中删除。
    猜你喜欢
    • 1970-01-01
    • 2018-05-06
    • 1970-01-01
    • 2012-06-11
    • 2016-03-21
    • 1970-01-01
    • 2021-07-31
    • 2014-12-09
    • 2021-01-02
    相关资源
    最近更新 更多