我嘗試通過java的內置功能(HttpURLConnection
)進行https連接。但是,我得到這個異常:Java中的證書路徑發現
javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
at com.sun.net.ssl.internal.ssl.Alerts.getSSLException(Alerts.java:174)
...
...
我的證書鏈是:
Root certificate -> Intermediate certificate -> Web server certificate
所使用的證書是正確的「路徑發現」的含義。信任錨點是根證書,它被導入到我的系統上的java密鑰庫中。中間證書不是...但
- 中間證書是由我信任的根簽名 - 所以我也相信中間人。
- Web服務器證書與中級證書籤名,這我相信(1點)
因此在驗證時必須順利通過?我錯了嗎?
我曾讀到這樣的:
瀏覽器可以做到自動發現,服務器對服務器沒有。
但是沒有這個功能是非常基本的。有沒有明確的做法auto-discovery?
* *更新
是的,這是問題,GPI。我很困惑,因爲瀏覽器可以驗證服務器證書,但Java應用程序不能。 這種行爲的原因是:
- 服務器只發送最後的證書,而不是整個證書 鏈;
- 該證書最近被收購併且相對於 簽署了新的中間證書;
- 瀏覽器有相對最新的證書列表 包括中間證書;
- java有相對不是最新的證書列表,並且 中間證書不在裏面。
- 瀏覽器驗證中間的最終證書 證書java無法檢查證書鏈,因爲:1. 鏈未被髮送; 2.最終證書的簽署者(中間名爲 )不是一個信任錨。
的解決方案可能是:
- 服務器返回的整個證書鏈
- 中間證書與Java信任存儲
URL serverUrl = new URL(serverAddress); connection =(HttpURLConnection)serverUrl.openConnection(); 是的,返回的對象是HttpsURLConnection,但它繼承HttpURLConnection。 – joro