我有一个客户端应用程序,它使用 SCHANNEL 来协商 TLS 1.1 和 TLS 1.2,该应用程序已经工作了多年。我最近更改了代码以使用 SCH_CREDENTIALS 而不是 SCHANNEL_CRED,它仍然适用于 Windows 10 上的 TLS 1.2(并且我假设是 TLS 1.1)。在 Windows 11 上运行时,它会按预期和期望尝试 TLS 1.3。但是,当 SCHANNEL 返回 SEC_I_RENEGOTIATE 状态时,它会失败。这种状态让我感到困惑,因为我的理解是,出于安全考虑,重新协商已从 1.3 中删除。 (我从来没有必要在 1.1 或 1.2 中实现它。)在 Microsoft 安全博客 https://www.microsoft.com/en-us/security/blog/2020/08/20/take-transport-layer- security-tls-to-the-next-level-with-tls-1-3/ ,谈到升级到 TLS 1.3,作者说要让升级后的代码正确处理 SEC_I_RENEGOTIATE 状态,但没有给出任何提示应该做。
请提供一些有关如何处理 SEC_I_RENEGOTIATE 状态的信息。
请注意,这不是网络客户端。这是自定义协议的加密连接,直接调用 SCHANNEl。当尝试连接到基于 OpenSSL 的服务器时,我可以重现该问题。
When you receive the SEC_I_RENEGOTIATE return code, your application must call AcceptSecurityContext (Schannel) (servers) or InitializeSecurityContext (Schannel) (clients), passing in empty input buffers. After this call returns a value, proceed as though your application were creating a new connection