如何调试Java HTTPS证书验证

时间:2019-12-04 19:46:44

标签: java ssl

我有一个第三方Java应用程序。它尝试通过HTTPS下载文件。不幸的是,在我的公司网络中,HTTPS被拦截,并且证书被无根的自定义证书替换。

现在,尽管我在/etc/ssl/certs/java/cacerts中拥有非根目录的CA(已仔细检查),但仍然无法通过以下方式下载:

java.io.IOException: Error downloading [https://zlib.net/zlib-1.2.11.tar.gz] to /tmp/zlib-1.2.11.tar.gz: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target

是否有任何方法可以调试JAVA在内部使用证书验证所做的工作? 像这样的东西:

  • 正在加载哪个CA
  • 验证需要采取哪些步骤
  • 为什么验证失败(详细)

如果我不需要使用反射或一些晦涩的东西,奖励积分;)

2 个答案:

答案 0 :(得分:2)

我会尝试使用动态调试实用程序。有一个选项可以打开SSL调试,这应该会对您有所帮助。

按照official documentation

  

JSSE提供了动态调试跟踪支持。这类似于   用于调试Java SE中的访问控制故障的支持   平台。访问通用的Java动态调试跟踪支持   使用java.security.debug系统属性,而   JSSE特定的动态调试跟踪支持可通过   javax.net.debug系统属性。当前选项是:

all: Turn on all debugging
ssl: Turn on SSL debugging
     

以下可以与ssl选项一起使用:

record: Enable per-record tracing
handshake: Print each handshake message
keygen: Print key generation data
session: Print session activity
defaultctx: Print default SSL initialization
sslctx: Print SSLContext tracing
sessioncache: Print session cache tracing
keymanager: Print key manager tracing
trustmanager: Print trust manager tracing

我认为这应该对您有所帮助。

答案 1 :(得分:1)

这不能直接回答您的问题。如果您真的需要调试它,请查看Vinnie的答案。

该错误消息非常具体,我认为您已经给出了有关失败原因的答案-您的流量被拦截,证书被替换为“飞行中”。您的问题可能是您的JVM无法加载<div class="email-entry desktop-container"> <div id="a"></div> <form name="form1" action="#"> <input id="test" type="text" name="text1" value="" placeholder="Email Address"> <input type="image" value="validate" onclick="ValidateEmail(document.form1.text1)" src="images/icon-arrow.svg" alt="submit"> <p id="addedText"></p> </form> </div>,并且无法信任被拦截的证书链。要指定该特定的/etc/ssl/certs/java/cacerts文件,请像这样添加cacerts作为VM选项

-Djavax.net.ssl.trustStore=/etc/ssl/certs/java/cacerts