如何从浏览器 SSL/TLS 会话中导出主密钥?

Posted

技术标签:

【中文标题】如何从浏览器 SSL/TLS 会话中导出主密钥?【英文标题】:How to export master secret from browser SSL/TLS session? 【发布时间】:2022-01-05 21:04:28 【问题描述】:

我想在 Windows 中打开浏览器,访问 HTTPS 站点,并在使用 Wireshark 捕获数据包时执行一系列操作。然后我想使用加密的数据包捕获来查看解密的HTTP流量。如果您放弃浏览器、访问服务器或添加 MITM,我知道有很多方法可以做到这一点(如下所列),但是当您受限于上述场景时,这些方法都不起作用。以下是我的典型做法:

服务器:对于我拥有服务器私钥的站点,请使用 Wireshark 的内置 SSL 解密。

MITM:SSL 代理(例如 Burp 套件)将允许查看解密的流量,但这需要使用与服务器使用的证书和密钥对不同的证书和密钥对。

浏览器:openssl 的 s_client 可以连接、发出请求和导出主密钥,但这不会显示关联的网页或运行 javascript 来计算后续请求参数。

有没有办法从“普通”浏览器导出主密钥,以便我以后可以使用它来解密浏览器会话的数据包捕获?

例如,当浏览器关闭时,SSL/TLS 状态是否存储在磁盘上?如果是这样,我将如何访问它?浏览器运行时是否可以在内存中访问它(如果可以,我将如何找到它)?

或者,是否所有 SSL 状态数据都由操作系统 (Windows) 存储并且无法直接访问?

或者,有没有办法强制浏览器为特定的 HTTPS 连接使用特定的主密钥(以及任何其他相关的 SSL 状态数据,如会话 ID 等)?如果是这样,我可以使用 s_client 设置 SSL 会话,然后将密钥数据传输到浏览器并在同一会话中打开一个新连接。这将通过不同的方式实现相同的目标。

【问题讨论】:

【参考方案1】:

对于使用 NSS 库的浏览器(例如 Firefox),您可以设置 SSLKEYLOGFILE environment variable,这将导致 NSS 保存必要的机密。然后,您可以直接将该文件与 Wireshark 一起使用。有更多信息可以找到here。

【讨论】:

以上是关于如何从浏览器 SSL/TLS 会话中导出主密钥?的主要内容,如果未能解决你的问题,请参考以下文章

SSL/TLS深度解析--OpenSSL 生成自签证书

什么是 SSL ?https 是如何保证数据传输的安全(SSL 是怎么工作保证安全的)

OpenMediaVault 5 进阶配置 启用 SSL/TLS

SSL/TLS/WTLS原理(密钥协商的形象化比喻:用服务器的公钥协商加密格式,然后再加密具体的消息)good

带有 KeyStore 和 ServerSockets 的 Java SSL/TLS

在 Tomcat 中配置 SSL/TLS 以支持 HTTPS