2014-01-31 27 views
1

我需要使用Java通過HTTPS連接到URL。我沒有任何SSL證書的使用經驗,這裏的大部分問題都假設了一些基本的知識。我希望這裏有人可以讓我開始基礎。通過SSL與Java連接:基礎知識

當我把URL放入瀏覽器時,它連接的很好。當我使用Java它:

new URL("https://mysite.com/").openStream() 

它拋出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

This question顯示瞭如何忽略整個證書的事情,但感覺不對。我只是想使用我的瀏覽器所使用的相同證書。

我已經嘗試過加入-Djavax.net.ssl.trustStore=cacerts屬性,它改變了例外javax.net.ssl.SSLException: java.lang.RuntimeException: Unexpected error: java.security.InvalidAlgorithmParameterException: the trustAnchors parameter must be non-empty,我已經從this question採取意味着它不能找到一個名爲cacerts信任存儲。不過,我不確定還需要指定什麼。

+0

似乎'mysite.com'使用自簽名證書,等等。您是否已將'mysite.com'提供的證書導入到'cacerts'? –

+0

我還沒有手動添加任何東西。我想,因爲我的瀏覽器可以找到證書,Java也應該能夠以某種方式獲得,我只需要告訴它在哪裏尋找。 – Jorn

+0

您需要使用jvm隨附的'keytool'命令來導入您的密鑰庫中的服務器證書(最有可能是簽名它的根CA)。 'cacerts'是jvm –

回答

1

許多站點對ssl使用自簽名證書。您應該將它們添加到您的JRE的cacerts文件中。在這種情況下,我使用以下步驟:

  1. 轉到https://mysite.com與瀏覽器
  2. 保存它的證書到本地機器
  3. 導入到您的cacerts與keytool命令。命令行看起來是這樣的:keytool -import -alias mysite -file mysite.cer -keystore {path/to/cacerts}

作爲替代方案,可以使用openssl s_client工具中檢索mysite.com證書。

+0

附帶的默認CA商店謝謝,這工作就像一個魅力!我創建了一個新的密鑰庫,而不是使用cacerts,因爲我不確定它想要什麼密碼,但這是一個小細節。所以,如果我理解正確,我的瀏覽器會自動檢測到該站點有一個所謂的「自簽名證書」並自動導入它,但我必須手動查找並導入它,以便Java能夠識別該證書。 – Jorn

+1

JRE的cacerts的默認密碼是'changeit' –

+0

是的,瀏覽器可以檢測到證書是自簽名的,等等。通常,他們會顯示如下警告:在這種情況下,「網站的安全證書不可信」。 –