SSL / TLS协议版本回退机制

时间:2014-01-14 15:29:10

标签: c++ visual-c++ ssl cryptography cryptoapi

我使用Microsoft Crypto API来处理SSL连接。与支持TLS 1.0或更高版本的服务器通信时,一切正常,但当我尝试处理仅支持SSL 3.0 InitializeSecurityContext()的服务器时,错误代码为0x80090331(SEC_E_ALGORITHM_MISMATCH)。

我尝试使用SCHANNEL_CRED结构作为AcquireCredentialsHandle()参数传递给pAuthData。特别是它有字段grbitEnabledProtocols,它应该控制一组支持的协议。当我设置grbitEnabledProtocols=SP_PROT_SSL3时,一切正常,但它破坏了安全性,因为我也想支持TLS 1.0,1.1和1.2,并且由于安全原因,无法与禁用SSL 3.0的服务器通信。

所以问题是:

当我设置grbitEnabledProtocols=SP_PROT_SSL3TLS1_X并尝试与仅支持SSL 3.0的服务器通信时,连接以TLS 1.2开始,然后服务器使用SSL 3.0标头和适当的数据进行响应。从这里开始,根据RFC,Crypto API应该使用SSL 3.0协议继续握手过程,但是它失败并且错误0x80090331SEC_E_ALGORITHM_MISMATCH,客户端和服务器无法通信,因为它们不具备一种常见的算法)。

有没有办法在MS Crypto API中启用TLS 1.0,1.1,1.2和SSL 3.0?

1 个答案:

答案 0 :(得分:0)

作为调试的一部分,你可以做两件事。

1>检查是否有一种方法可以在您正在使用的API中指定支持的协议。

2 - ;尝试尽可能包含所有加密和散列算法。

这两个选项在开放SSL中可用。

最好的方法是调试是使用wireshark并查找SSL协议发送的错误代码究竟是什么。