2014-01-14 130 views
5

我正在使用Microsoft Crypto API处理SSL连接。当与支持TLS 1.0或更高版本的服务器通信时,一切正常,但是当我尝试处理仅支持SSL 3.0的服务器时,InitializeSecurityContext()因错误代码0x80090331(SEC_E_ALGORITHM_MISMATCH)而失败。SSL/TLS协议版本回退机制

我试图玩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加密API,以使TLS 1.0,1.1,1.2与SSL 3.0沿?

回答

0

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

1>检查是否有指定您正在使用这些API支持的协议的方式。

2>尝试包括所有可能的加密和哈希算法。

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

最好的办法就是调试是使用Wireshark,寻找究竟是什么错误代码SSL协议发送。

+0

1>我试图指定协议,并且详细描述了它的问题。您是否阅读过包含grbitEnabledProtocols的部分?这是应该指定支持的协议的地方。 2>我包括所有的协议和加密,但它没有工作。 我发现OpenSSL有同样的问题,至少有一个问题相同的线程:http://openssl.6102.n7.nabble.com/Need-inputs-suggestions-on-SSL-TLS-protocol-version -fallback机制,td25597.html –