使用 TLS 1.2 请求连接时出现 SSL3 错误

信息安全 tls openssl
2021-09-05 14:05:32

即使我明确请求 TLS 1.2,我也遇到过几个引发 SSL3 握手错误的主机。为什么是这样?我是不是用openssl错了客户端?

$ openssl s_client -tls1_2 -connect id-images.vice.com:443
已连接(00000003)
140735150146384:错误:14094410:SSL 例程:ssl3_read_bytes:sslv3 警报握手失败:s3_pkt.c:1472:SSL 警报编号 40
140735150146384:错误:1409E0E5:SSL 例程:ssl3_write_bytes:ssl 握手失败:s3_pkt.c:656:
---
没有可用的对等证书
---
未发送客户端证书 CA 名称
---
SSL 握手已读取 7 个字节并写入 0 个字节
---
新,(无),密码是(无)
不支持安全重新协商
压缩:无
扩展:无
没有协商 ALPN
SSL-会话:
    协议:TLSv1.2
    密码:0000
    会话 ID: 
    会话 ID-ctx: 
    主密钥: 
    键-Arg:无
    PSK 身份:无
    PSK 身份提示:无
    SRP 用户名:无
    开始时间:1444078671
    超时:7200(秒)
    验证返回码:0(ok)
---
2个回答

在 SSL/TLS 中,客户端不请求特定的协议版本;客户端宣布它支持的最大协议版本,然后服务器选择将使用的协议版本。您的客户没有告诉“让我们使用 TLS 1.2”;它说“我知道TLS 1.2”。

客户可能有自己的额外要求,但没有空间在ClientHello消息中说明它们。如果客户端只想执行 TLS 1.2,那么他必须在其 中宣布“达到 TLS 1.2” ClientHello并且如果服务器响应的消息不是“让我们执行 TLS 1.2”,则还关闭连接。在您的情况下,事情甚至没有达到这一点:服务器以致命警报 40 响应(“handshake_failure”,请参阅标准)。正如@dave_thompson_085 指出的那样,这是由于缺少SNI:这是客户端在其ClientHello消息中记录名称的扩展的目标服务器。一些服务器需要 SNI,因为它们在同一个 IP 地址上托管多个启用 SSL 的站点,并且需要该参数来知道它们应该使用哪个证书。命令行工具openssl s_client可以发送带有显式-servername选项的 SNI

正如@Steffen 解释的那样,SSL 3.0 和所有 TLS 版本非常相似,并且使用相同的记录格式(至少在握手的早期阶段),因此 OpenSSL 倾向于重用相同的功能。请注意,由于服务器根本不响应 a ServerHello,因此尚未选择协议版本,并且 SSL 3.0 至少在概念上仍然是握手早期的可能性。

ssl3_read_bytesssl3_writes_bytes处理 SSL3 风格的框架。这些与以后的版本相同,即 TLS1.x。因此使用相同的函数,即使它们的名称可能暗示不同的事物。没有特定的tls1_read_bytes功能或类似的。