是否可以将 HTTPS 客户端身份验证流量存储/记录为签名文档?

信息安全 tls 客户
2021-08-20 17:02:18

在存在客户端 RSA 证书(例如,在智能卡上)的情况下,是否可以在表单中记录表单提交(或 AJAX 请求),以便以后确定客户端确实发送了该信息(例如,包含客户端用于加密数据的临时密钥的签名)?

我认为结果类似于一个二进制 blob,其中包含 TCP 上的 TLS 流量跟踪,并富含来自服务器的数据,这将使其自包含。

如果可能的话,是否可以不在这样的 blob 中泄露服务器的私钥?是否可以在不进行大量修改的情况下使用现有的 TLS 库来完成?

3个回答

不。

这个问题有一个更简单的场景,没有客户端证书。

你问,给定客户端和服务器之间的整个通信会话的 pcapng / tcpdump / wireshark 文件和 NSS 密钥日志格式的 SSLKEYLOGFILE 转储,这样你就可以解密存储的流量,这是否证明服务器发送了服务器发送的任何文件?

答案是否定的,不是。

TLS 不提供不可否认性。签名是您与另一方通信的证明,但它不是通信发生时间的证明(因为不推荐使用 gmt_unix_time),也不是通信内容的证明,只是通信发生的证明(可能没有任何应用程序正在发送的数据)。

握手之后,双方都有相同的对称密钥。双方都可以生成一个副本,显示对方使用预期的密钥发送、加密和验证的任何数据。没有办法知道这是否属实。

为了实现不可否认性,您需要在连接结束时添加数字签名,对整个连接的哈希进行签名,直到收到断开连接消息。但是 TLS 中没有这样的功能。

或者,您需要友好的本地 sigint 情报机构提供他们证明是真实的数据包捕获文件,并且通信的一方提供 SSLKEYLOGFILE 转储,然后您就会知道某些数据包确实是在那个方向发送的和明文数据。

客户端的证书仅用于对客户端进行身份验证。它不用于在客户端发送证书并证明私钥所有权之前发生的密钥交换。因此,客户端证书既不直接也不间接包含在流量加密或 MAC 中。这意味着捕获 TLS 流量不能用于稍后证明客户端已发送特定数据。

另请参阅关于证明服务器已发送某些内容的类似问题:如何证明某些服务器通过 HTTPS 发送了某些文件基本答案是相同的:没有站点使用自己的私钥对应用程序流量进行签名,但加密和 MAC 仅基于在密钥交换期间创建的共享密钥。

请参阅 Thomas Pornin 在https://crypto.stackexchange.com/questions/5455/does-a-trace-of-ssl-packets-provide-a-proof-of-data-authenticity的回答。与此处的其他答案一样,Thomas Pornin 解释说,客户端的签名不能用于证明有关客户端在会话期间发送到服务器的信息的任何内容。但是,服务器可能能够使用客户端的签名来证明客户端在特定时间连接到服务器。