我正在尝试在 Windows 下使用 Schannel 创建 DTLS“连接”(我正在最近的 Windows 10 版本下进行测试,因此 Schannel 支持的所有 DTLS 版本都应该可用)

我尝试从工作代码开始,按照文档建立常规 TLS 连接:

  • InitializeSecurityContext 在第一遍输入为空,SECBUFFER_TOKEN 和 SECBUFFER_ALERT 在输出
  • AcceptSecurityContext,输入为 SECBUFFER_TOKEN 和 SECBUFFER_EMPTY,输出为 SECBUFFER_TOKEN 和 SECBUFFER_ALERT。
  • 重复两步直到成功,然后继续使用 Encrypt/DecryptMessage

  • 这在流模式下工作得很好 (ISC_REQ_SEQUENCE_DETECT | ISC_REQ_REPLAY_DETECT | ISC_REQ_CONFIDENTIALITY |
    ISC_RET_EXTENDED_ERROR | ISC_REQ_ALLOCATE_MEMORY | ISC_REQ_STREAM )

    如果我尝试用 ISC/ASC_REQ_DATAGRAM 替换 STREAM,我的 InitializeSecurityContext 会按预期通过 SEC_I_CONTINUE_NEEDED 成功,但我的第一个 AcceptSecurityContext 会因 SEC_E_INVALID_PARAMETER 而失败。

    我尝试将 SCHANNEL_CRED 的 grbitEnabledProtocols 设置为 0 以使用双方记录的默认值,我还尝试将其设置为 SP_PROT_DTLS1_X,但我仍然从我的第一个 ASC 中得到无效参数返回。我也试过 DTLS_1_0 常量以防万一。

    此外,默认情况下在我的注册表设置中启用了所有安全协议(protocol)。

    根据我对 DTLS RFC 的理解,我的代码在 HelloVerifyRequest 步骤失败,而且,再次根据我对 RFC 的理解,这部分要求安全提供程序从 ClientHello 消息的几个部分以及源的IP地址。但是,我找不到任何记录方式将此信息传递给 ASC 函数。

    (我想?:) )我在整个互联网上搜索了 Schannel 下 DTLS 的任何工作示例用法,但没有任何运气。在stackoverflow上,我发现这个问题只是简单地提到它是受支持的:
    Is DTLS supported by Schannel on Windows 7? 和链接的 MSDN 文章只是一个高级概述。

    我搜索了与此功能相关的常量的任何用法......我搜索了与此相关的常量的任何用法(ISC_REQ_DATAGRAM、SP_PROT_DTLS*、SECBUFFER_DTLS_MTU,...)以及我唯一能找到的我能想到的所有搜索引擎要么是 sspi.h 的副本,要么是对 Windows API 中的常量进行索引的站点...

    我知道 DTLS 得到了其他实现(OpenSSL 等)的良好支持,但我真的更喜欢使用 Schannel,因为我的代码的其他部分目前在 TLS 模式下与 Schannel 一起工作得很好。

    最佳答案

    来自微软:
    没有使用 Schannel 实现 DTLS 的文档。已知和持续的文档差距。
    有一些差异,但是 TLS 客户端或服务器可以很容易地适应 DTLS(许多客户已经成功地做到了这一点)。

  • 将 SCHANNEL_CRED.grbitEnabledProtocols 设置为 SP_PROT_DTLS1_X。
  • 调用 AcceptSecurityContext 时,通过 SECBUFFER_EXTRA 传递客户端的 SOCKADDR。
  • MTU 可以通过 SetContextAttributes 使用常量 SEPKKG_ATTR_DTLS_MTU 设置,其中缓冲区只是一个指向 ULONG 的指针。 [默认为 1096 字节。]
  • 当 ISC/ASC 返回 SEC_I_MESSAGE_FRAGMENT 时,发送这个片段并再次调用 ISC/ASC,在一个循环中,以获取下一个片段(不尝试从网络读取数据)。
  • 在您的应用程序中实现超时和重传逻辑(因为
    schannel 不拥有套接字)。
  • 接收分片时,schannel会尝试消除
    如果可能,重复、重新排序和重新组装。
  • SCHANNEL_SHUTDOWN 不适用于 DTLS。
  • 关于windows - 使用 Schannel 的 DTLS,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/47678618/

    10-12 05:06