openssl s_client在握手时不提供指定的协议版本

时间:2014-11-24 22:58:17

标签: ssl openssl

我的一些计算机无法连接到互联网上的某些HTTPS服务器。为了调试这个,我开始学习openssl s_client和TLS 1.2协议,现在我在调试时感到困惑:

在我的某些机器上,如果我调用

openssl s_client -debug  -tls1_2 -connect admin.fedorahosted.org:443  

客户端以十六进制字节

启动握手
16 03 03 ...

但在大多数机器上它以

开头
16 03 01 ...

前者表示协议将是TLS 1.2,后者表示它将是TLS 1.0。前者听起来很合理,因为我在命令行上指定了这一点,但对于我来说似乎很奇怪第二个会发生,因为我明确要求TLS 1.2。

我已经在所有测试的CentOS机器上完成了yum update,因此它们名义上都处于openssl的同一级别。

这里可能会发生什么?

1 个答案:

答案 0 :(得分:0)

SSL / TLS是基于''''''协议,每个记录在5字节头中有一个版本字段,这是您在用于设置密码和协议版本的(未加密的)握手记录中看到的内容。

在握手交换中,协议版本和密码在" hello"中协商。记录。 client hello包含客户端支持的最高版本的字段,server hello(回复)包含最低的共享版本。假设客户端和服务器支持连续的版本范围,如果它们没有重叠,则发送协议版本警报(此时客户端可能会使用不同的版本重试)。

RFC 5246 Appendix E详细说明了尝试连接和确定协议的预期逻辑。它还包含您可能正在观察的问题的注释:

  

注意:已知某些服务器实现实现版本      谈判不正确。例如,有错误的TLS 1.0      客户端提供的服务器只关闭连接      版本比TLS 1.0更新。此外,众所周知,有些服务器会      如果包含任何TLS扩展,则拒绝连接      客户问候。与这些有缺陷的服务器的互操作性是一个复杂的过程      超出本文档范围的主题,可能需要多个      客户端的连接尝试。

很长一段时间,在第一个数据包("客户端问候")上看到SSLv2.0并不常见,以最大限度地提高互操作性,但是你现在应该只在非常老的软件上看到它(特别是因为那里& #39;不支持SNI and various other extensions,它至少需要TLSv1.0)。在这个Security.SE问题中有更多背景知识:https://security.stackexchange.com/questions/34827/why-clients-offer-handshaking-with-ssl-2-0-protocol

现在,至于为什么你在系统中看到不同的行为,没有CentOS和软件包版本,我无法分辨。您可以使用openssl version -a仔细检查OpenSSL版本,看看是否存在补丁级别差异。 Red Hat(以及CentOS)包括OpenSSL的大量补丁(除了删除各种专利算法外,还有大约65个补丁来改变行为或后端补丁和功能)。 (官方)1.0.1a的CHANGES描述了你所看到的,虽然我在这里猜测:

*) Workarounds for some broken servers that "hang" if a client hello
   record length exceeds 255 bytes.

   1. Do not use record version number > TLS 1.0 in initial client
      hello: some (but not all) hanging servers will now work.
   2. [...]