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

时间:2016-03-26 20:04:02

标签: c ssl openssl wireshark

我有一个应用程序,我使用OpenSSL 1.0.2,我想用Wireshark检查流量。 Wireshark可以(据称)解密TLS对话,前提是你给它预先保密。

如果我使用像TLS_RSA_WITH_AES_256_CBC_SHA256这样的密码套件;任何人都可以告诉我如何从SSLSSL_CTX结构中获取pre-master秘密?我可以在SSL对象中隐藏不透明的结构 - 这对于产品中的任何东西都不是;我只是想知道如何为Wireshark填充一个pre-master密文件。

1 个答案:

答案 0 :(得分:11)

我建议使用更容易理解的主密钥。据我所知,预主密钥仅在OpenSSL的堆栈上短暂存在。主密钥在ssl_session_st中可用(在1.0.2分支的ssl_locl.h中定义,但在更高版本中移至SSL)。 session成员变量ssl_session_st是指向其SSL_SESSION(又名RSA xxxx yyyy)的指针。

Wireshark可以使用主密钥和预主密钥来解密连接。 Wireshark在写这篇文章时支持的Here are the formats

  • xxxx 其中yyyy是加密的预主密钥的前8个字节(十六进制编码) 其中RSA Session-ID:xxxx Master-Key:yyyy是明文前主密码(十六进制编码) (这是bug 4349引入的原始格式)

  • xxxx 其中yyyy是SSL会话ID(十六进制编码) 其中PMS_CLIENT_RANDOM xxxx yyyy是明文主密钥(十六进制编码) (添加到支持openssl s_client主键输出) 这有点用词不当,因为RSA没有特定的东西 关于这一点。

  • xxxx 其中yyyy是ClientHello的client_random(十六进制编码) 其中CLIENT_RANDOM xxxx yyyy是明文前主密码(十六进制编码) (如果用户可以,此格式允许解密SSL连接 捕获PMS但无法恢复特定会话的MS 使用SSL服务器。)

  • xxxx 其中yyyy是ClientHello的client_random(十六进制编码) 其中{{1}}是明文主密钥(十六进制编码) (此格式允许解密非RSA SSL连接,即 ECDHE-RSA。)

请注意,前主密钥和主密钥都不是对称密钥(您的问题标题暗示您可能认为它是)。对称密钥源自主密钥和客户端/服务器随机数据。