[英]Certificate path discovery in Java
我嘗試通過java內置功能( HttpURLConnection
)建立https連接。 但是我得到了這個例外:
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密鑰庫中導入。 中間證書不是......但是
那么驗證必須通過成功嗎? 我弄錯了嗎?
在某處我讀到了這個:
瀏覽器可以進行自動發現,服務器到服務器則不行。
但缺乏這種功能是非常基本的。 有沒有明確的方法來進行這種自動發現 ?
* *更新
是的,這是問題,GPI。 我很困惑,因為瀏覽器可以驗證服務器證書但java應用程序不能。 這種行為的原因是:
解決方案可能是:
我相信你已經檢查了你的鏈,所以我們可以理所當然地認為RootCert簽署了IntermediateCert和IntermediateCert簽署的ServerCert ,有效的X500名稱鏈接和所有......
也就是說,您的邏輯是有效的,信任RootCert就足夠了,但不要忘記,為了構建路徑,您的客戶端必須擁有路徑中的所有證書。
在您的情況下,如果您只信任根證書,則服務器可以通告證書鏈的其余部分(中間和最終)。 如果沒有人“給”HTTP客戶端“中間證書”,那么客戶端將因為從根到服務器而失敗,而不知道中間是不可能的。
通過使用-Djavax.net.debug=all
選項啟動客戶端,您實際上可以看到服務器證書鏈是什么。 如果鏈的長度為1,那么您的服務器只會通告最終證書,客戶端無法猜測中間證書是否存在。
(也可以使用瀏覽器檢查並要求查看服務器證書,但是您應該注意瀏覽器將顯示信任錨的整個路徑,因此如果要推斷服務器鏈是什么,則必須從這條路徑中移除瀏覽器的錨點)。
在生產服務上,您應該參考您的證書提供商的網站,以了解什么是根證書(它可能不是最高級別的證書)。 此有效根應該是您的客戶端的信任錨,並且任何服務器都應該至少通告鏈中的最后一個證書(路徑中的最后一個證書,其公用名是服務器的DNS名稱)。
要通過Https連接,您需要使用HttpsURLConnection對象。 您無法使用HttpURLConnection對象創建連接。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.