在运行时查找HttpsURLConnection的信任库内容

时间:2016-06-08 14:00:08

标签: java ssl

我试图调试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调试工作,所以我需要一种方法来以编程方式执行此操作。

1 个答案:

答案 0 :(得分:0)

您可以使用<appSettings> add key="CacheConnection" value="MyCache.redis.cache.windows.net,abortConnect=false,ssl=true,password=..."/ </appSettings> 开启SSL调试。

这会产生很多输出。如果这对您来说太过分了,请查看调试JVM标志,如this thread

中所述