簡體   English   中英

Java中的證書路徑發現

[英]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密鑰庫中導入。 中間證書不是......但是

  1. 中間證書由我信任的根簽署 - 所以我也相信中間人。
  2. Web服務器證書是使用中級證書簽署的,我相信(第1點)

那么驗證必須通過成功嗎? 我弄錯了嗎?

在某處我讀到了這個:

瀏覽器可以進行自動發現,服務器到服務器則不行。

但缺乏這種功能是非常基本的。 有沒有明確的方法來進行這種自動發現

* *更新

是的,這是問題,GPI。 我很困惑,因為瀏覽器可以驗證服務器證書但java應用程序不能。 這種行為的原因是:

  • 服務器只發送最終證書,而不是整個證書鏈;
  • 最近購買了證書,並簽署了相對較新的中間證書;
  • 瀏覽器具有相對最新的證書列表,包括中間證書;
  • java有相對不是最新的證書列表,中間證書不在里面。
  • 瀏覽器通過中間證書驗證最終證書java無法檢查證書鏈,因為:1。鏈未被發送; 2.最終證書的簽名者(中間證書)不是信任錨。

解決方案可能是:

  • 服務器返回整個證書鏈
  • 要在java信任庫中添加的中間證書

我相信你已經檢查了你的鏈,所以我們可以理所當然地認為RootCert簽署了IntermediateCertIntermediateCert簽署的ServerCert ,有效的X500名稱鏈接和所有......

也就是說,您的邏輯是有效的,信任RootCert就足夠了,但不要忘記,為了構建路徑,您的客戶端必須擁有路徑中的所有證書。

在您的情況下,如果您只信任根證書,則服務器可以通告證書鏈的其余部分(中間和最終)。 如果沒有人“給”HTTP客戶端“中間證書”,那么客戶端將因為從服務器而失敗,而不知道中間是不可能的。

通過使用-Djavax.net.debug=all選項啟動客戶端,您實際上可以看到服務器證書鏈是什么。 如果鏈的長度為1,那么您的服務器只會通告最終證書,客戶端無法猜測中間證書是否存在。

(也可以使用瀏覽器檢查並要求查看服務器證書,但是您應該注意瀏覽器將顯示信任錨的整個路徑,因此如果要推斷服務器鏈是什么,則必須從這條路徑中移除瀏覽器的錨點)。

在生產服務上,您應該參考您的證書提供商的網站,以了解什么是根證書(它可能不是最高級別的證書)。 此有效根應該是您的客戶端的信任錨,並且任何服務器都應該至少通告鏈中的最后一個證書(路徑中的最后一個證書,其公用名是服務器的DNS名稱)。

要通過Https連接,您需要使用HttpsURLConnection對象。 您無法使用HttpURLConnection對象創建連接。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM