C++ SSL/TLS协议版本回退机制

C++ SSL/TLS协议版本回退机制,c++,visual-c++,ssl,cryptography,cryptoapi,C++,Visual C++,Ssl,Cryptography,Cryptoapi,我正在使用Microsoft Crypto API处理SSL连接。当与支持TLS 1.0或更高版本的服务器通信时,一切正常,但当我尝试处理仅支持SSL 3.0的服务器时,InitializeSecurityContext()失败,错误代码为0x80090331(SEC\u-E\u-ALGORITHM\u-MISMATCH) 我尝试使用传递给AcquireCredentialsHandle()的SCHANNEL\u CRED结构作为pAuthData参数。特别是,它具有字段grbitEnabled

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

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

所以问题是:

当我设置
grbitEnabledProtocols=SP_PROT\u SSL3TLS1_X
并尝试与仅支持SSL 3.0的服务器通信时,连接将以TLS 1.2开始,然后服务器使用SSL 3.0头和适当的数据进行响应。从这里开始,根据RFC,Crypto API应该使用SSL 3.0协议继续握手过程,但相反,它失败了,出现错误
0x80090331
SEC\u-E\u-ALGORITHM\u-MISMATCH
,客户端和服务器无法通信,因为它们没有通用的算法)


在MS Crypto API中是否有可能启用TLS 1.0、1.1、1.2以及SSL 3.0?作为调试的一部分,您可以做两件事

1> 检查是否有方法在您使用的API中指定受支持的协议

2> 尽量包含所有可能的加密和哈希算法

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


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

1>我尝试指定协议,详细描述了它。你们读过包括grbitEnabledProtocols在内的部分吗?这是一个应该指定支持的协议的地方。2> 我包括了所有的协议和加密,但它不起作用。我发现OpenSSL也有同样的问题,至少有一个线程有同样的问题: