将证书导入到 Java 密钥库,JVM 忽略新证书

我正在尝试在Tomcat 6上运行一个应用程序,以通过SSL连接到LDAP服务器。

我使用以下方法将服务器的证书导入密钥库:

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"

当我在打开SSL调试的情况下启动Tomcat时,根据日志,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使用了原始文件。


答案 1

将证书导入密钥库后,JVM 需要重新启动。


答案 2

检查是否存在具有相同 CN 信息但具有不同别名的密钥。

我以前遇到过类似的问题,当我尝试导入较新版本的证书,但将旧版本留在密钥库中时。我的Java程序只需在密钥库中找到第一个匹配的CN密钥(这是旧的过期密钥)并尝试使用它,即使有一个较新的密钥也与CN匹配。

还要确保密钥库中存在认证根证书(以及中间证书,如果适用)。如果您要针对威瑞信或 Globalsign 等主要安全提供商之一进行身份验证,他们通常会为您提供根证书和中间证书。如果密钥库中已存在这些证书,请确保它们仍然有效。您需要将所有证书从个人证书一直沿身份验证链一直保存到密钥库中的根证书,以便它了解如何验证您的凭据。