2016-08-20 77 views
1

我們開發了一個控制檯應用程序,它將從HTTPS上的ESB(https://esb.mkcl.org/)中獲取數據。當我打到這個網站時,我得到了javax.net.ssl.SSLPeerUnverifiedException: peer not authenticated異常。我將網址更改爲https://netbanking.hdfcbank.com/netbanking/,它也位於HTTPS上,打出後我沒有收到任何異常。爲什麼我需要在java中導入服務器證書

經過一番搜索後,我才知道我必須在java的keystore中導入公共證書,例如cacerts(C:\ Program Files \ Java \ jre6 \ lib \ security)。所以我從瀏覽器導出了https://esb.mkcl.org/的證書,並使用keytool在java中導入了證書,然後執行了控制檯應用程序並且它可以正常工作!沒有發生異常。

因此,問題是爲什麼我需要導入微粒 URL的證書(其他HTTPS URL在沒有導入任何證書的情況下工作在Java中)?

回答

3

通過服務器證書(COMODO RSA認證機構)使用的根證書是added到Java中的Java 8更新51,這樣就意味着你使用(從你的jre路徑的Java6)的Java版本太舊已經包括它。

要使該證書在默認情況下可信,請更新爲永不java的版本。

順便說一下,that server的ssl配置非常不安全。

+0

我知道爲什麼我需要將證書導入到java和關於ssl配置我告訴我的IT infra團隊,但他們說在glassfish中的所有配置是完美的!我不知道他們是怎麼說的。感謝您的證據。如果您對哪個配置不是「完美」有任何想法,請指導。 – Amogh

+0

那麼,ssllabs測試頁面列出的問題將在那裏詳細解釋。如果您查看第二個信任路徑,您會發現它需要額外下載由AddTrust External Root CA交叉簽名的上述根證書的[version](http://crt.comodoca.com/COMODORSAAddTrustCA.crt) (應該在信託商店中)。Java不會自動執行下載,因此對於該服務器來說,需要發送該證書,然後它將適用於較老的客戶端。 – mata

2

客戶端的SSL實現依賴於一組已知的「受信任的根證書」。這些是已知可信/可信的SSL證書頒發機構的證書。

「問題」是分佈在Java JDK/JRE中的密鑰庫中的可信任證書集(通常)比典型Web瀏覽器中的集合小。

這是有原因的。例如:

  • 出於安全原因,「服務器」Java安裝可能需要更保守默認情況下的信任。
  • 您可能正在運行一個較舊的(即沒有維護的)Java版本。顯然,Oracle不會用新的可信任證書刷新密鑰庫。

某些JRE可以使用主機操作系統默認密鑰庫或瀏覽器密鑰庫。

相關問題