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

我有一个使用OpenSSL 1.0.2的应用程序,我想用Wireshark检查流量。 Wireshark可以(据称)解密TLS对话,前提是您提供了预主密钥。

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

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

Wireshark可以使用主密钥和预主密钥来解密连接。 以下是 Wireshark在撰写本文时所支持的格式 :

  • RSA xxxx yyyy其中xxxx是加密的预主密钥的前8个字节(hex编码)其中yyyy是明文前主密码(hex编码)(这是bug 4349引入的原始格式)

  • RSA Session-ID:xxxx Master-Key:yyyy其中xxxx是SSL会话ID(hex编码)其中yyyy是明文主秘密(hex编码)(添加到支持openssl s_client主密钥输出)这有点是一个误称,因为RSA没有具体的相关信息。

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

  • CLIENT_RANDOM xxxx yyyy其中xxxx是ClientHello的client_random(hex编码)其中yyyy是明文主密钥(hex编码)(此格式允许解密非RSA SSL连接,即ECDHE-RSA。)

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