【问题标题】:JDK 11 PreMaster Secret debuggingJDK 11 PreMaster Secret 调试
【发布时间】:2020-08-24 08:50:55
【问题描述】:

使用 this simple https server 稍微修改以将 var 替换为 Java 8 兼容类型,我可以这样运行它:

$ java8 -cp . -Djavax.net.debug=ssl,keygen javatester.SimpleHTTPSServer | grep Nonce -C 5
SESSION KEYGEN:
PreMaster Secret:
0000: A7 7C E0 10 EB E5 7C 16   CF 70 65 30 04 AE 5B BC  .........pe0..[.
0010: 6F 61 52 6C FC 71 58 D9   F4 BD 10 70 69 10 62 2A  oaRl.qX....pi.b*
CONNECTION KEYGEN:
Client Nonce:
0000: A3 E4 45 27 77 6C 0D 5E   BD F1 4E 9D 1E 2E 10 02  ..E'wl.^..N.....
0010: 7F 6E A1 EC C2 BC 40 E3   1E 32 A9 B9 13 3B 6C B5  .n....@..2...;l.
Server Nonce:
0000: 5E B5 99 F9 02 EE C3 9E   84 30 01 32 B4 04 BA 38  ^........0.2...8
0010: B1 D9 B2 D9 6E 54 F4 4C   BF DC 60 98 97 AD 8B B2  ....nT.L..`.....
Master Secret:
0000: D6 14 BF 8E FF 69 93 9C   DB 58 35 AC 65 EF 5B A2  .....i...X5.e.[.
0010: 79 D7 3D 67 76 F7 CA 82   69 F9 30 34 9A C8 E7 EB  y.=gv...i.04....

这些值我可以使用create a Wireshark-capable premaster secret log file 来解码连接。但是,当我使用 jdk 11 运行它时,我没有得到任何 keygen 输出:

$ java11 -cp . -Djavax.net.debug=ssl,keygen javatester.SimpleHTTPSServer
Start single-threaded server at /0.0.0.0:8443
javax.net.ssl|DEBUG|01|main|2020-05-08 13:51:10.479 EDT|SSLCipher.java:437|jdk.tls.keyLimits:  entry = AES/GCM/NoPadding KeyUpdate 2^37. AES/GCM/NOPADDING:KEYUPDATE = 137438953472
javax.net.ssl|DEBUG|01|main|2020-05-08 13:51:24.367 EDT|SSLCipher.java:1824|KeyLimit read side: algorithm = AES/GCM/NOPADDING:KEYUPDATE
countdown value = 137438953472
javax.net.ssl|DEBUG|01|main|2020-05-08 13:51:24.369 EDT|SSLCipher.java:1978|KeyLimit write side: algorithm = AES/GCM/NOPADDING:KEYUPDATE
countdown value = 137438953472
javax.net.ssl|ALL|01|main|2020-05-08 13:51:24.382 EDT|X509Authentication.java:243|No X.509 cert selected for EC
javax.net.ssl|ALL|01|main|2020-05-08 13:51:24.382 EDT|X509Authentication.java:243|No X.509 cert selected for EC
javax.net.ssl|ALL|01|main|2020-05-08 13:51:24.382 EDT|X509Authentication.java:243|No X.509 cert selected for EC
javax.net.ssl|DEBUG|01|main|2020-05-08 13:51:24.414 EDT|SSLCipher.java:1978|KeyLimit write side: algorithm = AES/GCM/NOPADDING:KEYUPDATE
countdown value = 137438953472
javax.net.ssl|DEBUG|01|main|2020-05-08 13:51:24.417 EDT|SSLCipher.java:1824|KeyLimit read side: algorithm = AES/GCM/NOPADDING:KEYUPDATE
countdown value = 137438953472
GET / HTTP/1.1
Host: localhost:8443
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:68.0) Gecko/20100101 Firefox/68.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate, br
Connection: keep-alive
Upgrade-Insecure-Requests: 1
javax.net.ssl|ALL|01|main|2020-05-08 13:51:24.423 EDT|SSLSocketImpl.java:1002|Closing output stream
javax.net.ssl|DEBUG|01|main|2020-05-08 13:51:24.423 EDT|SSLSocketImpl.java:670|close outbound of SSLSocket
javax.net.ssl|ALL|01|main|2020-05-08 13:51:24.424 EDT|SSLSocketImpl.java:877|Closing input stream
javax.net.ssl|DEBUG|01|main|2020-05-08 13:51:24.425 EDT|SSLSocketImpl.java:636|close inbound of SSLSocket
javax.net.ssl|DEBUG|01|main|2020-05-08 13:51:24.425 EDT|SSLSocketImpl.java:473|duplex close of SSLSocket
javax.net.ssl|DEBUG|01|main|2020-05-08 13:51:24.425 EDT|SSLSocketImpl.java:1381|close the SSL connection (passive)

我想知道这是否不再受支持,但帮助命令表明它是:

$ java11 -cp . -Djavax.net.debug=help javatester.SimpleHTTPSServer
(...snipped)
ssl            turn on ssl debugging

The following can be used with ssl:
        record       enable per-record tracing
        handshake    print each handshake message
        keygen       print key generation data
        session      print session activity
(snipped...)

如何从 jdk11 连接中导出 premaster secret,以便在 Wireshark 中使用它们?

【问题讨论】:

  • Java 11 支持 TLS 1.3。可能是 TLS 1.3 的更改之一也会影响预主密钥,因此不再打印?我会将服务器限制为一组特定的 TLS 版本和密码套件,以使其具有可比性。或者,您可以试试这个project 来获取预主密钥。
  • 该项目有效,如果你回答我会接受它

标签: java ssl wireshark java-11


【解决方案1】:

如果较新的 Java 版本不再输出 pre-master secret,您可以使用项目 extract-tls-secrets

即时解密 HTTPS/TLS 连接。从安全 TLS 连接中提取共享机密以用于 Wireshark。附加到连接任一端的 Java 进程以开始解密。

这个项目的代码可以在启动时使用javaagent系统注入到TLS服务器或客户端,或者你可以连接到现有的Java进程(我假设是通过Java调试器接口)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-10-26
    • 2017-05-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-12
    相关资源
    最近更新 更多