能否通过javax.net.debug配置输出PEM格式的服务器证书?
我正在排查SSL/TLS相关问题,目前在命令行添加了-Djavax.net.debug参数开启调试,若能将服务器证书以可解析读取的格式输出到日志中,将极大提升排查效率。
我尝试过如下调试配置:
-Djavax.net.debug=ssl:record:plaintext -Djavax.net.debug=ssl:handshake:verbose:keymanager:trustmanager -Djavax.net.debug=ssl:handshake:verbose
其中最后一项配置的输出最接近需求,日志内容如下:
10/11/2021 10:27:36 "version" : "v3", 10/11/2021 10:27:36 "serial number" : "I8 00 00 00 00 D2 91 BH 88 A4 10 58 00 00 02 00 04 9E 4B", 10/11/2021 10:27:36 "signature algorithm": "SHA256withRSA", 10/11/2021 10:27:36 "issuer" : "CN=test, DC=test, DC=test, DC=com", 10/11/2021 10:27:36 "not before" : "2021-07-23 17:38:30.000 UTC", 10/11/2021 10:27:36 "not after" : "2026-07-22 17:38:30.000 UTC", 10/11/2021 10:27:36 "subject" : "CN=CNTest, OU=TIS, O=\"ACME Inc\", L=France, ST=Paris, C=EU", 10/11/2021 10:27:36 "subject public key" : "RSA", 10/11/2021 10:27:36 "extensions" : [ ... ]
上述输出已有一定参考价值,但如果能获取可读格式的服务器证书,便于将接收到的证书与服务器上实际部署的证书做比对,能进一步辅助问题排查。
我此前也尝试过使用openssl工具导出证书,但该Java应用还用到了队列服务,其使用的证书和我拿到的证书不一致,且很难通过openssl工具提取队列服务的证书。
后续我发现上述假设是错误的,实际问题是我们在clientHello阶段仅配置了1个服务器不支持的密码套件,导致握手失败,相关报错日志如下:
11/9/2021 3:24:03 PMSession ID: {} 11/9/2021 3:24:03 PMCipher Suites: [TLS_DHE_DSS_WITH_AES_256_CBC_SHA256] 11/9/2021 3:24:03 PMCompression Methods: { 0 } ... READ: TLSv1.2 Alert, length = 2 RECV TLSv1.2 ALERT: fatal, handshake_failure called closeSocket() handling exception: javax.net.ssl.SSLHandshakeException: Received fatal alert: handshake_failure
不过我最初的疑问仍然成立,该日志输出能力对调试工作有很高的实用价值。
内容的提问来源于stack exchange,提问作者bramdc
相关产品推荐
相关产品推荐

