我有一个应用程序,我使用OpenSSL 1.0.2,我想用Wireshark检查流量。 Wireshark可以(据称)解密TLS对话,前提是你给它预先保密。
如果我使用像TLS_RSA_WITH_AES_256_CBC_SHA256
这样的密码套件;任何人都可以告诉我如何从SSL
或SSL_CTX
结构中获取pre-master秘密?我可以在SSL
对象中隐藏不透明的结构 - 这对于产品中的任何东西都不是;我只是想知道如何为Wireshark填充一个pre-master密文件。
答案 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。)
请注意,前主密钥和主密钥都不是对称密钥(您的问题标题暗示您可能认为它是)。对称密钥源自主密钥和客户端/服务器随机数据。