2016-06-08 28 views
0

我正在嘗試調試https連接失敗的原因。我得到的錯誤是在運行時查找HttpsURLConnection的信任庫內容

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)和一個服務器運行一個客戶機(由我編寫)。該連接從工作,但未能從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

您可以使用-Djavax.net.debug=ssl打開SSL調試。

這產生了相當多的輸出。如果這太多了,請查看this thread

+0

中描述的調試JVM標誌。在大多數情況下,這可能是正確的答案。但是,在這種情況下(我忘了在我的問題中提到,會更新它)我無法獲得ssl調試工作。所以我正在尋找一種以編程方式獲取信息的方式。 –

+0

@AndersIvner你不能讓它工作如何?爲我工作了15年或更長時間。 – EJP

+0

@EJP在,我們發送標誌-Djavax.net.debug = ssl,但它仍然不會記錄任何東西。這是一個複雜的系統,該標誌在其他情況下有效,但在這種情況下不適用。 –