我的一些计算机无法连接到互联网上的某些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的同一级别。
这里可能会发生什么?
答案 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. [...]