我使用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协议继续握手过程,但是它失败并且错误0x80090331
(SEC_E_ALGORITHM_MISMATCH
,客户端和服务器无法通信,因为它们不具备一种常见的算法)。
有没有办法在MS Crypto API中启用TLS 1.0,1.1,1.2和SSL 3.0?
答案 0 :(得分:0)
作为调试的一部分,你可以做两件事。
1>检查是否有一种方法可以在您正在使用的API中指定支持的协议。
2 - ;尝试尽可能包含所有加密和散列算法。
这两个选项在开放SSL中可用。
最好的方法是调试是使用wireshark并查找SSL协议发送的错误代码究竟是什么。