TLS1.2 客户端和 TLS1.3 服务器握手失败

Handshake Failure with TLS1.2 client and TLS1.3 server

在 openssl 升级到 1.1.1 版本后,我有一个场景,我的客户端 (odbc) 在 TLS1.2 上是 运行,而我的服务器(数据库)在 TLS 1.3 上是 运行 并且它失败了 客户端出现以下错误。

"SSL Handshake Failure reason [error:1407743E:SSL routines:SSL23_GET_SERVER_HELLO:tlsv1 alert inappropriate fallback]."

在 TLS 1.3 文档中写道,默认情况下启用回退保护,当 TLS 1.2 客户端与 TLS 1.3 服务器通信时,服务器会发送特殊字节以进行回退保护。

以下是我的疑惑。 - 我必须在我的客户端处理这些特殊字节吗? - 是否需要 TLS 1.2 客户端与 TLS 1.3 服务器通信的任何其他处理? - 还是有其他原因导致失败?

我猜是这样的:

1) 客户端发送 TLS 1.2 握手
2) 服务器关闭连接,因为它只支持 TLS 1.3
3) 客户端使用回退 SCSV 重试 TLS 1.1 握手(参见 RFC 7507)
4)服务器发送错误信息:不合适的回退

初始连接失败(第2步),因为客户端请求1.2,服务器不支持。如果服务器可能支持此版本,客户端会重试 1.1。发送回退 SCSV 以指示 1.1 不是客户端支持的最高版本。

根据 SCSV RFC (7507):

如果 TLS_FALLBACK_SCSV 出现在 ClientHello.cipher_suites 中并且服务器支持的最高协议版本高于 ClientHello.client_version 中指示的版本,服务器必须响应致命的 inappropriate_fallback 警报。

要回答你的问题,我相信你提到的特殊字节是 SCSV,但这是由客户端发送并由服务器处理的,因此客户端无事可做。我认为失败是由于客户端和服务器没有用于通信的通用 TLS 版本。如果客户端只支持 1.2 而服务器只支持 1.3,他们将无法就版本达成一致,连接将失败。在服务器上启用 TLS 1.2 或在客户端启用 TLS 1.3 应该允许它们进行通信。