我正在尝试创建一个DTLS"连接"在Windows下使用Schannel(我在最近的Windows 10版本下进行测试,因此Schannel支持的所有DTLS版本都应该可用)
我尝试从工作代码开始,按照文档建立常规TLS连接:
这在流模式下工作得很好(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一起工作正常。
答案 0 :(得分:3)
来自微软: 没有使用 Schannel 实现 DTLS 的文档。已知且持续的文档差距。
存在一些差异,但 TLS 客户端或服务器可以很容易地适应 DTLS(许多客户已经成功地做到了这一点)。
答案 1 :(得分:-1)
可以以https://github.com/mobius-software-ltd/iotbroker.cloud-windows-client为例,在windows上实现DTLS 它不使用 SChannel 而是使用 netty 库。 MQTT-SN 和 CoAP 在这个项目下都支持 DTLS。 BR 玉莲欧法