在 TLS 中,客户端宣布其最大支持版本。然后服务器以实际用于连接的协议版本进行响应。
例如,如果服务器知道 TLS 1.0 和 1.1,并且客户端宣布“我支持 TLS 1.2”,则服务器在不知道 TLS 1.2 可能是什么的情况下,仍然可以响应:“好吧,我们将使用 1.1” .
从理论上讲,如果客户端说“我支持最高 TLS 1.38”(它将被编码ClientHello
为值 0x03 0x27 的两个字节),那么支持最高 TLS 1.2 的服务器将不知道 TLS 版本 1.3、1.4 是什么... 到 1.38 是(事实上,这样的版本还不存在,现在定义的最大值是TLS 1.2);但是,该服务器仍然可以说:“1.38 高于/晚于 1.2,因此客户端应该知道 TLS 1.2”并继续说明:“我们将使用 1.2”。
在实践中,有些服务器写得不好,当客户端说“TLS 1.3”时,它们会断开连接。这是一个服务器错误;但一个普遍的。该错误通常由表达“版本不容忍”指定。其中一些有问题的服务器接受某些未知版本,但不是全部。例如,某些服务器会容忍 0 到 254 范围内的任何x的任何“1.x”版本,但会拒绝“2.y”版本。
由于版本不容忍,客户端(Web 浏览器)必须已经包含尝试多次的应急代码。例如,它首先尝试使用 1.2 中的“1.2”连接ClientHello
,但如果连接失败,客户端将再次尝试使用“1.0”作为最大支持版本。这是令人厌烦和笨拙的。不能容忍 TLS 1.3 版本的服务器是当指定 TLS 1.3 并且浏览器开始使用它时会很麻烦的服务器。