【问题标题】:SSL/TLS protocol version fallback mechanismSSL/TLS 协议版本回退机制
【发布时间】:2014-02-02 17:38:29
【问题描述】:

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

我尝试使用作为pAuthData 参数传递给AcquireCredentialsHandle()SCHANNEL_CRED 结构。特别是它有字段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?

【问题讨论】:

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


    【解决方案1】:

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

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

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

    这两个选项在 open SSL 中可用。

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

    【讨论】:

    • 1> 我尝试指定协议,并在问题中有详细描述。您是否阅读了包含 grbitEnabledProtocols 的部分?这是一个应该指定支持的协议的地方。 2> 我包括了所有的协议和加密,但它不起作用。我发现OpenSSL也有同样的问题,至少有一个线程有同样的问题:openssl.6102.n7.nabble.com/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-08-20
    • 2017-06-25
    • 1970-01-01
    • 2018-11-26
    • 2021-05-13
    • 1970-01-01
    • 2016-11-07
    相关资源
    最近更新 更多