如何使用基于 OpenSSL 的客户端提取预主密钥?

How do I extract the pre-master secret using an OpenSSL-based client?

我正在制作一个使用 OpenSSL 1.0.2 的应用程序,我想使用 Wireshark 检查流量。 Wireshark 可以(据称)解密 TLS 对话,前提是你给它预主密钥。

如果我使用像 TLS_RSA_WITH_AES_256_CBC_SHA256 这样的密码套件;谁能告诉我如何从 SSLSSL_CTX 结构中获取预主密钥?我可以破解 SSL 对象中的不透明结构——这不适用于产品中附带的任何东西;我只想知道如何为 Wireshark 填充预主密钥文件。

我推荐使用万能钥匙,它更容易获得。据我所知,pre-master 密钥仅临时存在于 OpenSSL 的堆栈中。主密钥在 ssl_session_st 中可用(在 1.0.2 分支的 ssl.h 中定义,但在更高版本中移至 ssl_locl.h)。 SSL 成员变量 session 是指向它的 ssl_session_st(又名 SSL_SESSION)的指针。

Wireshark 可以使用主密钥以及 pre-master 密钥来解密连接。 Here are the formats 在撰写本文时 Wireshark 支持:

  • RSA xxxx yyyy 其中 xxxx 是加密的 pre-master 秘密 (hex-encoded) 的前 8 个字节 其中 yyyy 是明文 pre-master 秘密 (hex-encoded) (这是错误 4349 引入的原始格式)

  • RSA Session-ID:xxxx Master-Key:yyyy 其中 xxxx 是 SSL session ID (hex-encoded) 其中 yyyy 是明文主密钥 (hex-encoded) (添加支持 openssl s_client Master-Key 输出) 这有点用词不当,因为没有什么特定于 RSA 的 关于这个。

  • PMS_CLIENT_RANDOM xxxx yyyy 其中 xxxx 是来自 ClientHello (hex-encoded) 的 client_random 其中 yyyy 是明文 pre-master 秘密 (hex-encoded) (此格式允许解密 SSL 连接,如果用户可以 捕获 PMS 但无法恢复特定 session 的 MS 使用 SSL 服务器。)

  • CLIENT_RANDOM xxxx yyyy 其中 xxxx 是来自 ClientHello (hex-encoded) 的 client_random 其中 yyyy 是明文主密钥 (hex-encoded) (此格式允许 non-RSA SSL 连接被解密,即 ECDHE-RSA.)

请注意,pre-master 密钥和主密钥都不是对称密钥(您的问题标题暗示您可能认为是)。对称密钥源自主密钥和 client/server 随机数据。