我知道我可以直接在 Charles 中查看解密的 HTTPS 数据。但我想在 Wireshark 中查看较低级别的 SSL 消息。因此,我将 Charles 设置为 SSL 代理,使用我自己的证书,并在 Wireshark 中使用本地 IP 地址和我的私钥设置 SSL 解析器首选项。
但是,Wireshark 中的消息仍然是加密的。
我错过了什么?
答案1
我在使用 Charles Proxy 与 Wireshark 结合时遇到了完全相同的问题。
我认为问题在于 Charles 向客户端发送了两个(或更多)证书(检查代理发送到客户端的证书消息)。Wireshark 随后将使用该列表中的第一个证书,该证书可能与您生成的私钥不匹配。
(这正是用户戴夫·汤普森在评论中感到疑惑。)
我已经通过从 Wireshark 中提取证书来检查这一点。请注意,Wireshark 以以下格式提取证书.der
。然后我将.der
文件转换为.pem
证书:
openssl x509 -inform DER -outform PEM -text -in wireshark_charles.der -out wireshark_charles.pem
我还将 转换.pem
为.crt
,但这不是必需的。
Charles 向客户发送的证书
$ openssl x509 -noout -modulus -in wireshark_charles.crt | openssl md5
7a37a32781daf79402623c19ac9c8d7f
在 Charles 中设置自定义证书
$ openssl x509 -noout -modulus -in charles_custom.crt | openssl md5
62ea5ed061fca62efaaecbbb0226b08e
对应的私钥
$ openssl rsa -noout -modulus -in charles_custom.pem | openssl md5
62ea5ed061fca62efaaecbbb0226b08e
Charles 发送的证书的模数与自定义生成的私钥的模数不匹配。
Wireshark 也会在 SSL 解析过程中记录此问题:
ssl_decrypt_pre_master_secret wrong pre_master_secret length (128, expected 48)
ssl_generate_pre_master_secret: can't decrypt pre master secret
Charles 使用自定义证书作为根证书生成新的每主机证书。不幸的是,我还没有找到提取 Charles 生成的每主机私钥的方法。我建议使用 Burp Proxy。在 Burp 中,您可以选择要使用的证书类型。