SSLv3 HandShake 但 TLSv1 客户端你好

信息安全 tls
2021-09-02 14:45:37

我试图了解握手协议,当我们开启 ssl 调试模式时,我们看到握手是 SSLv3,但客户端 Hello 是 TLSv1。

http-8443-14,阅读:SSLv3 握手,长度 = 87 *** ClientHello,TLSv1

这意味着什么?

客户端发送一个 SSLv3 ClientHello,以便只理解 SSLv3 的服务器可以处理该消息,并继续进行 SSLv3 握手。但是 SSLv3 ClientHello 也说“顺便说一下,我知道 TLSv1,所以如果你也知道 TLSv1,让我们使用 TLSv1 而不是 SSLv3。

如果这没有任何意义,请更正,我不是网络/IS 人。

3个回答

您的最后一段是正确的:确实,在ClientHello消息中,客户端宣布了其“最大支持版本”。因此,同时支持 SSL 3.0 和 TLS 1.0 的客户端会说“我知道TLS 1.0”(内部,“TLS 1.0”被编码为“SSL 3.1”),但仍会接受使用 SSL 3.0。将使用的协议版本由服务器选择(在其ServerHello消息中)。

但是,您观察到的是来自 SSL 的另一个特性的人工制品,即版本被指示两次即 SSL 中的所有流量都作为records发送,并且所有记录都有一个五字节的头部,表示:

  • 记录中的数据类型(类型为“握手消息”、“警报”、“更改密码规范”或“应用程序数据”)(一个字节)。
  • 记录协议版本(两个字节)。
  • 记录长度(两个字节)。

所以你观察到的报告线:

http-8443-14, READ: SSLv3 Handshake, length = 87 *** ClientHello, TLSv1

可能意味着:“已观察到一条‘握手消息’类型的记录,版本为 SSL 3.0,长度为 87 字节。其内容原来是一条ClientHello消息,内部显示‘我,客户端,支持最高 TLS 1.0 的协议版本’ 。”

SSL 客户端习惯于在第一条记录上使用“低”版本(3.0),因为有旧的和损坏的 SSL 服务器不仅不支持 TLS,而且在面对标记为“TLS 1.0”的记录时会恐慌和死亡",即使未加密的 TLS 1.0 记录的格式与未加密的 SSL 3.0 记录的格式完全相同(记录标头中的版本除外)。

有关 SSL 的此类详细信息的更多信息,请阅读

虽然您省略了有关您正在使用的软件堆栈的任何信息,但我认为这只是使用 SSLv3 处理例程来解析 TLSv1 数据的另一种情况。这是可能的,因为这两种协议非常相似。使用 OpenSSL 堆栈,您会发现很多例程都在谈论 SSLv3,或者在函数名称中包含 sslv3 的内容,即使它们处理 TLSv1.0+ 数据。

这是非常正确的。详细信息在 TLS RFCs 中列出,但这里是简短版本:

TLS 消息分多层发送;ClientHello 消息在 TLSPlaintext 记录中发送,该记录通过(通常)TCP 传输。TLSPlaintext 记录有一个“版本”字段,这是SSLv3您看到的来源。ClientHello 消息有一个“client_version”字段,它是TLSv1报告的值。

TLS 实现应该接受以“3”开头的任何版本(TLSv1 是 3.1,TLSv1.1 是 3.2,等等)。在实践中,如果此版本高于它们可以支持的版本,某些服务器将静默失败(而不是发出有用的警报)。所以客户端通常发送“3.0”(SSLv3)或他们可以支持的最低版本。