使用和解码原始 SSL 数据作为证据

Posted

技术标签:

【中文标题】使用和解码原始 SSL 数据作为证据【英文标题】:Using and decoding raw SSL data as proof 【发布时间】:2022-01-11 16:17:00 【问题描述】:

我想解码和存储原始 SSL/TLS 数据,以便将来证明一些事情,我认为如果我用一个例子来描述它会更好:

1) 有一个远程 REST 端点可通过 SSL 访问并提供一些有用的数据。此端点由某个第三方控制,我无法控制它。

2) 我向该端点发出 GET 请求,并将响应的原始 SSL 流量存储在一个文件中,然后将解码后的 ssl 流量存储在另一个文件中

3) 另外我将此端点的 SSL 证书保存在一个单独的文件中(我猜这个操作只需要执行一次)

如果我在获得上述步骤中的所有数据时理解正确,并且在未来,当另一个第三方要求我提供过去某个时间远程服务器上存在某些数据的证据时,我可以:

1) 向他们出示我保存的证书(步骤 3)。由于此证书是由知名机构签署的,因此我伪造它的可能性几乎为零

2) 向他们展示 RAW SSL 数据以及使用上述证书对其进行解码的方法

3) 在解码的 REST 响应标头中,还应该存在远程服务器时间。

因此,如果我没记错的话,我几乎可以毫无疑问地证明,在过去的某个时间点,即使远程服务器本身不再运行,远程方的服务器上也存在某些数据.

因此,我可以使用原始 SSL 数据来证明过去远程服务器上存在某些东西。而且几乎没有人质疑这种说法,因为伪造响应数据或标头意味着我能够破解 SSL 加密。

有没有办法让这些场景自动化?我的意思是有没有办法以一种可以让以后轻松解码的形式记录原始 SSL 数据?

我已经尝试使用 firefox/chrome 浏览器以及 sslkeylog 文件并使用 wireshark 嗅探流量 - 它确实有效,但是有没有办法使用某种 REST 库来自动化它,因为每次使用 firefox 并记录 SSL 密钥可能很麻烦 - 可能需要每小时存储数千个这样的请求,并且手动执行将是一项全职工作,另外我不确定是否有办法证明存储在 ssskeylog 文件中的这些密钥实际上匹配远程服务器的证书...

【问题讨论】:

您正在寻找的技术称为数字签名。您目前的方法既不合适也不可行。 【参考方案1】:

不,您无法证明服务器发送了数据。例如,使用 TLS_RSA_WITH_AES_256_CBC_SHA256 作为密码套件,您可以在整个 TLS 会话中伪造来自双方的所有数据,甚至无需联系服务器。而且服务器端也可以产生这样的伪造。正如 EJP 所指出的,唯一不能伪造的是经过签名 的数据。使用 RSA 密码套件,唯一签名的是证书,但它们不会更改,也不会以加密方式绑定到 TLS 会话。

其他密码套件可能涉及一些签名握手数据,但 TLS 并非旨在提供不可否认性,所以我怀疑它是偶然的。

【讨论】:

你是对的,我已经删除了我的答案。创建虚假应用程序数据所需的只是客户端知道的主密钥。因此,客户端可以伪造任何数据并声称服务器已发送这些数据。 谢谢 Stefan,我知道你要么删除你的答案,要么告诉我为什么我错了,在这种情况下我会删除我的答案。 感谢您的回答。所以我假设没有办法证明数据来自某个服务器,如果它不签署数据并且只使用 TLS? @Pma:您可以证明数据来自客户端或服务器,但您无法证明更具体的内容。 @Pma:tlsnotary 听起来很有希望。它看起来旨在允许客户端证明它生成了指定的 HTTPs Web 流量,而不是允许服务器证明某些东西。当然,我不知道 tlsnotary 协议有任何安全分析。

以上是关于使用和解码原始 SSL 数据作为证据的主要内容,如果未能解决你的问题,请参考以下文章

在 Zapier 中解码原始数据

base64解码文件不等于原始未编码文件

在 HAproxy 1.5 中使用 SSL 证书

如何使用 python 解码 SSL 证书?

Netty入门--使用SSL/TLS加密Netty程序

使用 FFmpeg API 加载 G.729 解码器时出现问题