我试图调试https连接失败的原因。我得到的错误是
sun.security.validator.ValidatorException: PKIX path building failed:
sun.security.provider.certpath.SunCertPathBuilderException: unable to find
valid certification path to requested target
代码使用的是Java 7的内置信任库。
对于这种情况,有一个客户端(由我编写)从两台不同的机器(A和B)和一台服务器运行。连接从A工作,但由于B的上述异常而失败。我已运行以下代码来记录信任管理器:
trustManagerFactory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
trustManagerFactory.init((KeyStore)null);
for (TrustManager trustManager : trustManagerFactory.getTrustManagers()) {
System.out.println(trustManager);
if (trustManager instanceof X509TrustManager) {
X509TrustManager x509TrustManager = (X509TrustManager)trustManager;
for (X509Certificate c : x509TrustManager.getAcceptedIssuers())
{
System.out.println(c.get);
}
}
}
此代码在A和B上记录几乎相同的证书,最重要的是服务器所需的根证书同时存在。
因此,我正在寻找一种在运行时检查连接对象的方法,以确定实际使用的证书。有没有办法做到这一点?
更新:我无法让ssl调试工作,所以我需要一种方法来以编程方式执行此操作。
答案 0 :(得分:0)
您可以使用<appSettings>
add key="CacheConnection" value="MyCache.redis.cache.windows.net,abortConnect=false,ssl=true,password=..."/
</appSettings>
开启SSL调试。
这会产生很多输出。如果这对您来说太过分了,请查看调试JVM标志,如this thread
中所述