簡體   English   中英

VeriSign簽名證書中的Java SSLHandshakeException

[英]Java SSLHandshakeException in VeriSign signed certificate

在Java桌面應用程序中,我需要連接到SSL URL。 嘗試時,出現異常:

SSLHandshakeException:sun.security.validator.ValidatorException:PKIX路徑構建失敗:sun.security.provider.certpath.SunCertPathBuilderException:無法找到到請求目標的有效證書路徑

為了解決這個問題,我用瀏覽器轉到該地址,將證書下載到.cert文件中,然后使用keytool命令導入到我的java cacerts密鑰庫中。 之后,該應用程序運行正常。

我的問題是:如果用VeriSign簽名,為什么Java無法識別證書? 默認情況下,cacerts密鑰庫中未安裝VeriSign證書嗎? 也許我不明白SSL是如何工作的。 瀏覽器和Java桌面行為之間有什么區別? 我可以使用瀏覽器連接到該URL,而無需進行任何安裝。

謝謝

當我們訪問使用SSL提供身份和加密的安全站點時,它會提供由受信任的第三方站點(如verisign,godaddy或thwate)驗證的證書。

通過使用證書,瀏覽器或Java客戶端知道他們正在與正確的站點(據稱是該站點)交談,而不是在重定向的代理站點上交談。 如果您使用瀏覽器訪問網站,則此步驟非常透明,因為如果證書不在瀏覽器的受信任存儲區中,它將要求您添加該證書,然后將其添加。

但是,當您使用Java程序訪問安全站點時,證書握手的這一步驟對用戶而言並不透明,並且證書已通過JRE的trustStore進行了驗證。

了解更多: http : //javarevisited.blogspot.com/2012/03/add-list-certficates-java-keystore.html#ixzz32v1wL3Gl

您沒有說要導入密鑰庫的證書。 通常,驗證涉及多個證書:

  • 受信任的根證書,該證書存儲在密鑰庫或瀏覽器中(Java不與瀏覽器共享密鑰庫)
  • 標識站點的葉子證書
  • 多數情況下還提供中間證書,這些證書提供了從葉證書到受信任根的簽名方式,從而建立了受信任路徑

如果缺少任何中間證書,則驗證失敗。 因此,服務器不僅必須發送葉證書,還必須發送所有中間證書。 這就是許多站點失敗的地方,例如,它們不提供完整的證書鏈。

但是,為什么這在瀏覽器中有效呢? 由於足夠多的站點無法提供中間證書,並且由於瀏覽器希望提供最佳體驗,因此它們將緩存中間證書。 因此,如果您轉到由提供了受信任鏈的verisign簽名的一個站點,然后再轉到使用相同證書但未提供該鏈的站點簽名,則該站點仍將起作用,因為鏈證書是從另一邊。

但是,如果您使用的是全新系統(或者只是使用Firefox的新瀏覽器配置文件)並首先訪問配置錯誤的網站,那么該網站也會像Java應用程序一樣抱怨該網站。 而且,如果您只是將相關的中間證書導入密鑰庫中並因此信任它,那么它也將起作用,因為它不需要鏈的其余部分即可獲取通往受信任證書的路徑。

暫無
暫無

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

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