【问题标题】:Decrypt client-side SSL traffic in Wireshark generated by Java HttpsURLConnection在 Wireshark 中解密 Java HttpsURLConnection 生成的客户端 SSL 流量
【发布时间】:2012-07-21 11:52:29
【问题描述】:

我正在尝试使用由其他人编写的 GUI Java 程序,该程序的行为与我预期的不同。在程序运行的过程中,它会联系服务器来拉取数据,但它没有显示正确的数据。我正在尝试确定我遇到的问题是否与网络相关——即正确的位永远不会到达客户端。

查看 Java 程序的源代码,它似乎使用 HttpsURLConnection 类通过 SSL 从服务器中提取数据。我想做的是使用 Wireshark 检查电线上发生的事情。我的理解是,如果你有相关的密钥,Wireshark 支持解密一些 SSL 流量。我不控制服务器,因此无法访问其私钥。但是,我确实控制了程序正在运行的客户端。我的问题是,在实践中我将如何配置wireshark 来解密我刚刚描述的场景的SSL 流量?是否有可以添加到 Wireshark 的特定键 HttpsURLConnection 使用?还有别的吗?

我应该注意,我考虑过简单地将日志记录添加到 Java 代码库中,但最终我会更喜欢数据包捕获的基本事实而不是日志记录,因为我可能会错过/省略在我不使用的代码库的日志记录中的一些重要内容不完全明白。

【问题讨论】:

    标签: java ssl wireshark httpsurlconnection


    【解决方案1】:

    由于您无权访问服务器私钥,Wireshark 不能直接用于解密。

    即使使用私钥,Wireshark 也无法解密流量,以防使用具有完美前向保密 (PFS) 的密码。

    您需要的是一个中间人代理,从您的应用程序的角度来看,它就像一个 SSL 服务器,从服务器的角度来看,它就像客户端一样工作。

    有很多程序可以作为代理运行,例如.Net/Windows 上的FiddlerWebscarabBurpSuite (Java)。对于所有这些程序,您需要导出他们使用的服务器证书并将其作为可信证书添加到您的程序中,例如通过在启动应用的命令行上指定合适的信任库(请参阅 Java 属性 javax.net.ssl.trustStrore)。

    【讨论】:

    • 如果我无法通过wireshark在没有私钥的情况下从服务器解密数据,客户端应用程序如何能够解密?
    • 这是通过密钥协议协议完成的。在协议结束时,每一方(客户端、服务器)都知道秘密,但秘密本身永远不会在他们之间转移。另见Diffie–Hellman key exchange (Wikipedia)
    【解决方案2】:

    您可以使用 extract-ssl-secrets 工具从任何 Java 应用程序中提取 Wireshark 所需的密钥。

    如果开箱后无法正常工作,请参阅 troubleshooting section

    【讨论】:

      猜你喜欢
      • 2013-05-27
      • 2017-09-18
      • 2017-01-15
      • 2019-12-09
      • 2017-10-04
      • 1970-01-01
      • 2013-03-26
      • 2022-10-17
      • 2016-02-27
      相关资源
      最近更新 更多