使用和解码原始 SSL 数据作为证据
Using and decoding raw SSL data as proof
我想解码并存储原始SSL/TLS数据,以便将来证明一些事情,我认为如果我通过一个例子来描述它会更好:
1) 有一个远程 REST 端点可通过 SSL 访问并提供一些有用的数据。此端点由某些第三方控制,我无法控制它。
2) 我向此端点发出 GET 请求并将响应的原始 SSL 流量存储在一个文件中,然后将解码后的 SSL 流量存储在另一个文件中
3) 另外我将这个端点的 SSL 证书保存在一个单独的文件中(我想这个操作只需要完成一次)
如果我理解正确,当我从上述步骤和将来获得所有数据时,当另一个第三方要求我提供证据证明过去某个时间远程服务器上有某些数据时,我可以:
1) 向他们出示我保存的证书(第 3 步)。由于此证书是由知名机构签署的,因此我伪造它的可能性几乎为零
2) 向他们展示 RAW SSL 数据以及使用上述证书对其进行解码的方法
3) 在解码的 REST 响应中 headers 远程服务器时间也应该存在。
因此,如果我没记错的话,我几乎可以毫无疑问地证明,在过去的某个时间点,即使远程服务器本身不存在,远程方的服务器上也存在某些数据运行时间更长。
因此我可以使用原始 SSL 数据来证明过去远程服务器上存在某些东西。并且很少有人质疑这一说法,因为伪造响应数据或 headers 将意味着我能够破解 SSL 加密。
有没有办法自动执行此类场景?我的意思是,有没有一种方法可以将原始 SSL 数据记录为便于日后轻松解码的形式?
我已经尝试使用 firefox/chrome 浏览器和 sslkeylog 文件并使用 wireshark 嗅探流量 - 它确实有效,但是自从使用 firefox 和记录以来,有没有办法使用某种 REST 库来自动化它每次 SSL 密钥都会很麻烦——可能需要每小时存储数千个这样的请求,手动完成将是一项全职工作,此外我不确定是否有办法证明这些密钥存储在 ssskeylog 中文件实际上匹配远程服务器的证书...
不,您无法证明服务器发送了数据。例如,使用 TLS_RSA_WITH_AES_256_CBC_SHA256 作为密码套件,您可以伪造整个 TLS 会话中双方的所有数据,甚至无需联系服务器。并且服务器端也可以产生这样的伪造。正如 EJP 所指出的,您唯一不能伪造的是 签名 的数据。使用 RSA 密码套件,唯一签名的是证书,但它们不会更改,也不会以加密方式绑定到 TLS 会话。
其他密码套件可能涉及一些签名的握手数据,但 TLS 并非旨在提供不可否认性,因此我怀疑它是偶然的。
我想解码并存储原始SSL/TLS数据,以便将来证明一些事情,我认为如果我通过一个例子来描述它会更好:
1) 有一个远程 REST 端点可通过 SSL 访问并提供一些有用的数据。此端点由某些第三方控制,我无法控制它。
2) 我向此端点发出 GET 请求并将响应的原始 SSL 流量存储在一个文件中,然后将解码后的 SSL 流量存储在另一个文件中
3) 另外我将这个端点的 SSL 证书保存在一个单独的文件中(我想这个操作只需要完成一次)
如果我理解正确,当我从上述步骤和将来获得所有数据时,当另一个第三方要求我提供证据证明过去某个时间远程服务器上有某些数据时,我可以:
1) 向他们出示我保存的证书(第 3 步)。由于此证书是由知名机构签署的,因此我伪造它的可能性几乎为零
2) 向他们展示 RAW SSL 数据以及使用上述证书对其进行解码的方法
3) 在解码的 REST 响应中 headers 远程服务器时间也应该存在。
因此,如果我没记错的话,我几乎可以毫无疑问地证明,在过去的某个时间点,即使远程服务器本身不存在,远程方的服务器上也存在某些数据运行时间更长。
因此我可以使用原始 SSL 数据来证明过去远程服务器上存在某些东西。并且很少有人质疑这一说法,因为伪造响应数据或 headers 将意味着我能够破解 SSL 加密。
有没有办法自动执行此类场景?我的意思是,有没有一种方法可以将原始 SSL 数据记录为便于日后轻松解码的形式?
我已经尝试使用 firefox/chrome 浏览器和 sslkeylog 文件并使用 wireshark 嗅探流量 - 它确实有效,但是自从使用 firefox 和记录以来,有没有办法使用某种 REST 库来自动化它每次 SSL 密钥都会很麻烦——可能需要每小时存储数千个这样的请求,手动完成将是一项全职工作,此外我不确定是否有办法证明这些密钥存储在 ssskeylog 中文件实际上匹配远程服务器的证书...
不,您无法证明服务器发送了数据。例如,使用 TLS_RSA_WITH_AES_256_CBC_SHA256 作为密码套件,您可以伪造整个 TLS 会话中双方的所有数据,甚至无需联系服务器。并且服务器端也可以产生这样的伪造。正如 EJP 所指出的,您唯一不能伪造的是 签名 的数据。使用 RSA 密码套件,唯一签名的是证书,但它们不会更改,也不会以加密方式绑定到 TLS 会话。
其他密码套件可能涉及一些签名的握手数据,但 TLS 并非旨在提供不可否认性,因此我怀疑它是偶然的。