DTLS使用Schannel

时间:2017-12-06 16:04:28

标签: windows winapi sspi dtls schannel

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

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

  1. InitializeSecurityContext,第一次传递时为空输入,SECBUFFER_TOKEN&输出上的SECBUFFER_ALERT
  2. 使用SECBUFFER_TOKEN&的AcceptSecurityContext SECBUFFER_EMPTY输入,SECBUFFER_TOKEN& SECBUFFER_ALERT输出。
  3. 重复这两个步骤,直到它们成功,然后继续使用Encrypt / DecryptMessage
  4. 这在流模式下工作得很好(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常量以防万一。

    此外,我的注册表设置默认启用所有安全协议。

    根据我对DTLS RFC的理解,我的代码在HelloVerifyRequest步骤失败,而且,根据我对RFC的理解,这部分要求安全提供程序也从ClientHello消息的一些部分生成cookie。作为源的IP地址。但是,我找不到任何记录的方法将此信息传递给ASC函数。

    (我想?:))我已经在整个互联网上搜索了SLSnel下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一起工作正常。

2 个答案:

答案 0 :(得分:3)

来自微软: 没有使用 Schannel 实现 DTLS 的文档。已知且持续的文档差距。

存在一些差异,但 TLS 客户端或服务器可以很容易地适应 DTLS(许多客户已经成功地做到了这一点)。

  1. 将 SCHANNEL_CRED.grbitEnabledProtocols 设置为 SP_PROT_DTLS1_X。
  2. 调用 AcceptSecurityContext 时,通过 SECBUFFER_EXTRA 传递客户端的 SOCKADDR。
  3. MTU 可以通过 SetContextAttributes 使用常量 SEPKG_ATTR_DTLS_MTU 设置,其中缓冲区只是一个指向 ULONG 的指针。 [默认为 1096 字节。]
  4. 当 ISC/ASC 返回 SEC_I_MESSAGE_FRAGMENT 时,发送此片段并在循环中再次调用 ISC/ASC 以获取下一个片段(无需尝试从网络读取数据)。
  5. 在您的应用程序中实现超时和重传逻辑(因为 schannel 不拥有套接字)。
  6. schannel在接收fragment时会尝试消除 如果可能,重复、重新排序和重新组装。
  7. SCHANNEL_SHUTDOWN适用于 DTLS。

答案 1 :(得分:-1)

可以以https://github.com/mobius-software-ltd/iotbroker.cloud-windows-client为例,在windows上实现DTLS 它不使用 SChannel 而是使用 netty 库。 MQTT-SN 和 CoAP 在这个项目下都支持 DTLS。 BR 玉莲欧法