2013-10-08 43 views
1

我有一個通過HTTPS託管webaplication和rest API的web服務器。有一個由安裝在服務器上的Symantech簽署的* .thedomain.com 的證書。 「thedomain」就是爲了這個例子。這不是真正的域名。如何使用由公共CA授權簽署的服務器公共證書解決「無法找到有效的證書路徑到請求的目標」?

我認爲信任鏈沒有問題,因爲服務器提供的證書被任何瀏覽器的默認設置接受而不做任何事情。

現在我正在嘗試在Java中爲該服務器提供的其餘API創建一個客戶端。

問題是要拋棄一個sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path到要求的目標。如果我正確理解這一點,這意味着JDK支持的ca不提供有效的證書路徑,以便正確驗證服務器。

什麼是這個錯誤的良好解決方案,同時仍然能夠驗證服務器? Web瀏覽器如何驗證服務器而不是JDK(7)?

+0

它在瀏覽器中工作,因爲CA證書位於瀏覽器的密鑰環中,而不在JDK使用的密鑰環中。 –

+0

@StefanoSanfilippo謝謝。我沒有手動添加任何東西到瀏覽器的鑰匙圈。有沒有辦法告訴Java使用廣泛接受的可信CA列表(如大多數瀏覽器默認設置所接受的列表)? –

+3

從命令行嘗試使用'keytool -keystore cacerts -importcert -alias aliasOfTheCertificate -file FileNameOfTheCertificate.cer'。請注意,許多Linux發行版已經發布了一個包含所有可信根的'ca-certs-java'軟件包。 –

回答

3

它在瀏覽器中工作,因爲CA證書位於瀏覽器的密鑰環中,而不在JDK使用的密鑰環中。

keytool -keystore cacerts -importcert -alias aliasOfTheCertificate -file FileNameOfTheCertificate.cer 

命令行:

使用keytool到CA證書與添加到JDK鑰匙圈。請注意,許多Linux發行版已經發布了一個包含所有可信根的ca-certs-java軟件包,如果可能的話儘量使用它。

1

所以,這裏有幾個想法。

1.)Symantech似乎是相當新的,可能不在您正在使用的cacerts文件中。你有沒有嘗試過最新版本的jdk/jre?

2.)我會建議使用InstallCert應用程序來創建一個新的cacerts文件,它將信任來自您站點的證書。您需要使用-Djavax.net.ssl.trustStore和-Djavax.net.ssl.trustStorePassword參數指向VM參數中的新cacerts文件。

+0

感謝這些想法,但是1 /是我正在使用JDK 2的最後一個版本/在這種情況下,我首選使用本地情況與自定義信任存儲(已安裝服務器的公用證書)。我有點驚訝,我不得不這樣做,因爲我期望Java –

+0

可以在開箱時考慮可信的CA,這個迴應意味着信息量大,而不是增加。 InstallCert應用程序非常整潔。它完全按照您的要求提供,它將獲取基礎Java cacerts文件的副本,從您輸入的站點下載公共證書,並將其添加到新複製的cacerts文件中。這基本上就是你所做的,但是你可以直接訪問公共證書,這也適用於完成相同任務的不同方式。 – hooknc

相關問題