您的最后一段是正确的:确实,在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 的此类详细信息的更多信息,请阅读此。