我正在尝试在Windows下使用Schannel创建DTLS“连接”(我正在测试最近的Windows 10版本,因此Schannel支持的所有DTLS版本都应该可用)
我尝试通过遵循文档中的步骤,从已有的代码建立常规TLS连接:
1. 在第一次传递时使用空输入的InitializeSecurityContext,输出SECBUFFER_TOKEN和SECBUFFER_ALERT 2. 在输入上使用SECBUFFER_TOKEN和SECBUFFER_EMPTY的AcceptSecurityContext,输出SECBUFFER_TOKEN和SECBUFFER_ALERT。 3. 重复以上两个步骤直到成功,然后继续使用Encrypt/DecryptMessage 在流模式(ISC_REQ_SEQUENCE_DETECT | ISC_REQ_REPLAY_DETECT | ISC_REQ_CONFIDENTIALITY | ISC_RET_EXTENDED_ERROR | ISC_REQ_ALLOCATE_MEMORY | ISC_REQ_STREAM)下,这很完美地运行。
如果我尝试将STREAM替换为ISC/ASC_REQ_DATAGRAM,则我的InitializeSecurityContext成功返回SEC_I_CONTINUE_NEEDED,但我的第一个AcceptSecurityContext随即失败,并显示SEC_E_INVALID_PARAMETER。
我已尝试将SCHANNEL_CRED的grbitEnabledProtocols设置为0以使用双方都记录的默认值,我还尝试将其设置为SP_PROT_DTLS1_X,但我仍然从我的第一个ASC中得到了Invalid Parameter返回值。 我也尝试了DTLS_1_0常量,以防万一。此外,所有安全协议在我的注册表设置中默认启用。根据我对DTLS RFC的理解,我的代码在HelloVerifyRequest步骤失败,而且根据我对RFC的理解,此部分需要安全提供程序从ClientHello消息的几个部分以及源IP地址生成cookie。但是,我找不到任何记录的方法来将此信息传递给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 中常量的网站...
我知道其他实现(如 OpenSSL 等)很好地支持 DTLS,但我真的更喜欢使用 Schannel,因为我的代码的其他部分目前在 TLS 模式下可以正常工作。
我尝试通过遵循文档中的步骤,从已有的代码建立常规TLS连接:
1. 在第一次传递时使用空输入的InitializeSecurityContext,输出SECBUFFER_TOKEN和SECBUFFER_ALERT 2. 在输入上使用SECBUFFER_TOKEN和SECBUFFER_EMPTY的AcceptSecurityContext,输出SECBUFFER_TOKEN和SECBUFFER_ALERT。 3. 重复以上两个步骤直到成功,然后继续使用Encrypt/DecryptMessage 在流模式(ISC_REQ_SEQUENCE_DETECT | ISC_REQ_REPLAY_DETECT | ISC_REQ_CONFIDENTIALITY | ISC_RET_EXTENDED_ERROR | ISC_REQ_ALLOCATE_MEMORY | ISC_REQ_STREAM)下,这很完美地运行。
如果我尝试将STREAM替换为ISC/ASC_REQ_DATAGRAM,则我的InitializeSecurityContext成功返回SEC_I_CONTINUE_NEEDED,但我的第一个AcceptSecurityContext随即失败,并显示SEC_E_INVALID_PARAMETER。
我已尝试将SCHANNEL_CRED的grbitEnabledProtocols设置为0以使用双方都记录的默认值,我还尝试将其设置为SP_PROT_DTLS1_X,但我仍然从我的第一个ASC中得到了Invalid Parameter返回值。 我也尝试了DTLS_1_0常量,以防万一。此外,所有安全协议在我的注册表设置中默认启用。根据我对DTLS RFC的理解,我的代码在HelloVerifyRequest步骤失败,而且根据我对RFC的理解,此部分需要安全提供程序从ClientHello消息的几个部分以及源IP地址生成cookie。但是,我找不到任何记录的方法来将此信息传递给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 中常量的网站...
我知道其他实现(如 OpenSSL 等)很好地支持 DTLS,但我真的更喜欢使用 Schannel,因为我的代码的其他部分目前在 TLS 模式下可以正常工作。