我正在使用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协议进行握手过程,但是由于它们不具有通用算法,它会失败并返回错误0x80090331
(SEC_E_ALGORITHM_MISMATCH
,客户端和服务器无法通信)。
是否有任何可能的方式在MS加密API,以使TLS 1.0,1.1,1.2与SSL 3.0沿?
1>我试图指定协议,并且详细描述了它的问题。您是否阅读过包含grbitEnabledProtocols的部分?这是应该指定支持的协议的地方。 2>我包括所有的协议和加密,但它没有工作。 我发现OpenSSL有同样的问题,至少有一个问题相同的线程:http://openssl.6102.n7.nabble.com/Need-inputs-suggestions-on-SSL-TLS-protocol-version -fallback机制,td25597.html –