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

tpu*_*nen 19 java security tomcat keytool ssl-certificate

我正在尝试在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"
Run Code Online (Sandbox Code Playgroud)

当我启动Tomcat并启用SSL调试时,根据日志Tomcat使用正确的证书文件:

trustStore is: C:\Program Files\Java\jdk1.6.0_32\jre\lib\security\cacerts
Run Code Online (Sandbox Code Playgroud)

但是,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
Run Code Online (Sandbox Code Playgroud)

重启Tomcat没有帮助.我已经使用keytool -list命令验证了新证书确实存在于该文件中.

为什么Tomcat一直忽视我的新证书?

编辑:

似乎问题是由Windows 7 VirtualStore引起的.Keytool创建了cacert文件的新副本,而Tomcat使用了原始文件.

小智 17

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


wat*_*ios 5

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

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

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

  • 您不需要将证书添加到信任库中已有的证书之上。商店中的任何证书都是可信的,无需进一步验证。但是别名的好建议! (2认同)