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

Ted*_*ton 7 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密钥文件.

rha*_*oto 11

我建议使用更容易获得的主密钥.据我所知,预主密钥仅在OpenSSL的堆栈上短暂存在.主密钥可用ssl_session_st(在ssl.h1.0.2分支中定义,但ssl_locl.h在以后的版本中移动).的SSL成员变量session是一个指向它的ssl_session_st(又名SSL_SESSION).

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

  • RSA xxxx yyyyxxxx加密的预主密钥的前8个字节 在哪里(十六进制编码)yyyy明文前主密钥(十六进制编码)在哪里(这是bug 4349引入的原始格式)

  • RSA Session-ID:xxxx Master-Key:yyyyxxxxSSL会话ID 在哪里(十六进制编码)yyyy明文主密钥在哪里(十六进制编码)(添加到支持openssl s_client主密钥输出)这有点用词不当,因为没有RSA特定的内容.

  • PMS_CLIENT_RANDOM xxxx yyyy 其中xxxx是从所述的ClientHello(十六进制编码)如果client_random yyyy是明文预主秘密(十六进制编码的)(这种格式允许SSL连接进行解密,如果用户可以捕获PMS,但不能恢复该MS要与SSL服务器的特定会话.)

  • CLIENT_RANDOM xxxx yyyyxxxxClientHello中的client_random 在哪里(十六进制编码)其中yyyy是明文主密钥(十六进制编码)(此格式允许解密非RSA SSL连接,即ECDHE-RSA.)

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

  • 仅供参考:OpenSSL 1.1.0提供[SSL_SESSION_get_master_key()](https://www.openssl.org/docs/man1.1.0/ssl/SSL_SESSION_get_master_key.html)功能. (3认同)