为什么 OpenSSL 1.1.1(Linux 客户端)在更改密码规范之前发送应用程序数据?

为什么 OpenSSL 1.1.1(Linux 客户端)在更改密码规范之前发送应用程序数据?

我们使用内部编译的适用于 Windows 和 Linux 的 OpenSSL 1.1.1i。

我们在 Windows 中的客户端成功连接了 Nginx 服务器(我不知道其版本)。

Linux 客户端失败,并出现“alert bad record mac”错误。

Wireshark 显示 Windows 客户端正在发送“应用程序数据”仅有的发送 Change Cipher Spec 之后。

Wireshark 显示 Linux 客户端正在发送“应用程序数据”它发送更改密码规范。(据我们所知,应用程序数据不是来自客户端应用程序)。

此后不久,服务器发送一个“应用程序记录”,从而在客户端触发“坏记录 mac”错误。

那么,是什么原因造成的?库为什么在“更改密码规范”之前发送“应用程序数据”?这允许吗?

更新

我添加了一些图片,以防有人感兴趣。(我不知道添加太多图片是否被视为不良形式或垃圾邮件。如果是的话,我会删除它们)。

在此处输入图片描述

在此处输入图片描述

在此处输入图片描述

在此处输入图片描述

在此处输入图片描述

答案1

您正在查看 TLS 版本 1.3,其握手与早期版本的握手有很大不同。

在 TLS 1.3 中,“ChangeCipherSpec”消息毫无意义——它只是为了满足一些绝对坚持看到该消息的入侵检测系统而发送的(有些系统会试图阻止“格式错误的” TLS 连接)。

此外,ServerHello 之后的所有握手消息已加密在 TLS 1.3 中,它被伪装成“应用程序数据”消息(以安抚防火墙和 IDS 系统),而实际的消息类型隐藏在加密的有效负载中。

因此,日志中的前几个“应用程序数据”消息实际上可能包含握手有效负载(例如加密的“证书”消息),而不是实际的应用程序请求。

答案2

消息中的“mac”可能属于 短信认证码,在这种情况下意味着该消息无法被验证。

我猜测 Linux 客户端和 Nginx 服务器没有使用相同的密码或相同的 TLS 版本,而 Windows 软件使用了正确的版本。

因此请检查两端实际使用或安装的版本,或者其配置的参数。

相关内容