2012-05-07 164 views
14

我試圖讓運行在Tomcat 6之上的應用程序通過SSL連接到LDAP服務器。向Java密鑰庫,JVM導入證書會忽略新證書

我導入服務器證書使用至密鑰存儲:

C:\Program Files\Java\jdk1.6.0_32\jre\lib\security>keytool -importcert -trustcacerts -file mycert -alias ca_alias -keystore "c:\Program Files\Java\jdk1.6.0_32\jre\lib\security\cacerts" 

當我啓動Tomcat與SSL調試開啓,根據Tomcat正在使用正確的證書文件日誌:

trustStore is: C:\Program Files\Java\jdk1.6.0_32\jre\lib\security\cacerts 

然而,Tomcat不添加我剛剛導入的證書 - cacerts文件中的所有其他證書都打印到日誌中 - 連接失敗:

handling exception: 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 

重新啓動Tomcat並沒有幫助。我已經使用keytool -list命令驗證了新證書確實存在於文件中。

爲什麼Tomcat不斷忽略我的新證書?

編輯:

看來,這個問題是由Windows 7的VirtualStore引起的。 Keytool創建了一個cacert文件的新副本,而Tomcat使用了原始文件。

+0

文件'mycert'是否包含整個證書鏈? Java希望整個信任路徑在商店中。 – Romain

+0

只是一個簡單的建議,轉到你的'C:\ Users \ YourAccountName',一個文件名'.keystore'將會在那裏,打開它並從你的文件中刪除以前的文件,然後再次執行你的操作。希望這可以爲你解決問題:-) –

+1

@Romain不,可信證書與鏈條無關。導入爲可信證書的任何證書都被視爲受信任的根證書。 – emboss

回答

4

檢查是否存在具有相同CN信息但具有不同別名的密鑰。

我曾嘗試導入證書的較新版本,但將舊版本保留在密鑰庫中時遇到類似問題。我的Java程序只會在密鑰庫(這是舊的過期的)中找到第一個匹配的CN密鑰,並嘗試使用它,即使有一個也與CN匹配的新密鑰。

還要確保在密鑰庫中存在身份驗證根證書(以及適用的中間證書)。如果您正在對Verisign或Globalsign等主要安全提供商進行身份驗證,他們通常會爲您提供根證書和中間證書。如果這些證書已經存在於密鑰庫中,請確保它們仍然有效。您需要將您的個人證書中的所有證書一直沿着身份驗證鏈連接到存儲在密鑰庫中的根目錄,以便了解如何驗證憑證。

+0

這似乎不是問題,但感謝您的建議 – tputkonen

+0

我編輯了我的答案。您是否檢查過密鑰庫中是否存在證書頒發機構的根證書? – wattostudios

+1

您不需要在已存在於信任存儲區中的證書上添加證書。商店中的任何證書都是可信的,無需進一步驗證。但別名的好建議! – emboss

0

您所描述的正是我在使用cmd.exe和一個普通用戶(雖然是Windows Server上管理組的成員)時所得到的結果。您必須以管理模式啓動cmd.exe才能將更改應用於cacerts文件。至少在Win2k8操作系統上。

如果你不這樣做,這個脫字號會在keytool.exe -list視圖中向你顯示新添加的證書,但Tomcat不會看到它們。不知道爲什麼如此。但是當你添加cmd.exe時,以管理員身份啓動Tomcat對於新添加的證書沒有問題。

您還可以使用Djavax.net.debug="ssl,handshake"來查看Tomcat從cacerts文件讀取的內容。

14

將證書導入密鑰庫後,JVM需要重新啓動。