解密TLS https数据流量

时间:2015-12-29 13:09:18

标签: java ssl encryption packet-sniffers tls1.2

我已经实现了类似于提议的Java网络数据包嗅探器 http://www.freeproject.co.in/source/Network-Packet-Sniffer.aspx?pf=Java&t=webhttp://packetsnifferusingjpcap.blogspot.it/

现在我想解密来自https的数据流,试图这样做我设置变量SSLKEYLOGFILE,这样浏览器就会将用于生成TLS会话密钥的值写入指示的文件中。此变量见https://isc.sans.edu/forums/diary/Psst+Your+Browser+Knows+All+Your+Secrets/16415/

正如https://developer.mozilla.org/en-US/docs/Mozilla/Projects/NSS/Key_Log_Format

中所述

SSLKEYLOGFILE指示的文件是一系列行。注释行以尖锐字符('#')开头。否则该行采用这些格式之一。

RSA <space> <16 bytes of hex encoded encrypted pre master secret> <space> <96 bytes of hex encoded pre master secret>

CLIENT_RANDOM <space> <64 bytes of hex encoded client_random> <space> <96 bytes of hex encoded master secret>

如何使用SSL / TLS机密日志文件解密java代码中的网络包?

3 个答案:

答案 0 :(得分:1)

由于wireshark已经实现了所有必要的逻辑,您可以通过tshark管理捕获的数据,并将输出文本解析回应用程序。

你也可以在bouncycastle之类的加密库的帮助下自己完成,但这需要付出很多努力,因为你仍然需要解析握手和一切(SSLKEYLOGFILE包含只是真正的秘密位,成功解密流量仍然需要很多上下文!)。

答案 1 :(得分:1)

要回答您的具体问题,您需要创建一个TLS客户端。有许多好的TLS Java库可用,但在尝试使用第三方工具之前,您可能会尝试使用JRE捆绑的Java安全套接字扩展(JSSE)。 JSSE与其他Java加密工具很好地集成。要开始使用,您可以使用these JSSE samples

如果默认JSSE实现中的API不适合您的需求,请查看这两个适用于Java的开源TLS库:

解密数据包后,您当然还需要处理HTTP流量。为此,您可以将数据包交还给浏览器或其他HTTP客户端库。

注1 :在TLS握手期间创建的临时秘密仅适用于特定的TLS会话。收集这些短暂的秘密不允许您创建一般代理,如Mallory would want to mount a generic man-in-the-middle attack但它确实允许您访问TLS加密的信息,因此如果Alice登录到她的银行,Alice的用户名和密码将成为现在可用的TLS加密数据的一部分。这是一个原因,即使Alice创建了“强”密码,用户名 - 密码方案的安全性也很差。

注意2 :在TLS中,Alice必须信任她的TLS客户端,即,当Alice使用公共终端时,Alice 信任她的浏览器是Google的Chrome版本,而不是Chromium的Chuck's or Malloy's版本。

注3 :在TLS中,Alice必须信任,当Bob连接到Bob的服务器时,只有Bob可以访问Bob的私钥。如果Chuck捕获了Bob的私钥,那么Chuck可以在没有Alice注意的情况下代理Bob的网站(而且,遗憾的是,通常需要Bob长时间注意) - 不幸的是,有许多IT运营弱点这使得这个特殊场景相对容易,但这不是对TLS本身的技术攻击。

注4 :如果客户端易受攻击且服务器有责任,Mallory可以使用Key Compromise Impersonation attack作为对TLS的一般中间技术攻击; KCI目前主要得到缓解。

答案 2 :(得分:0)

您可以使用Charles Proxy(30天免费),它是用Java编写的,可以检查未加密的https流量,并且比WireShark友好得多。但Charles Proxy只处理http / https,wireshark更为通用。