我正在尝试在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"
当我启动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使用了原始文件 .
4 回答
将证书导入密钥库后,JVM需要重新启动 .
检查是否存在具有相同CN信息但具有不同别名的密钥 .
我之前遇到类似的问题,当我尝试导入较新版本的证书但将旧版本留在密钥库中时 . 我的Java程序只是在密钥库中找到第一个匹配的CN密钥(这是旧的已过期的密钥库)并尝试使用它,即使有一个新的也与CN匹配 .
还要确保密钥库中存在身份验证根证书(如果适用,则为中间证书) . 如果您要对Verisign或Globalsign等主要安全提供商之一进行身份验证,他们通常会为您提供根证书和中间证书 . 如果密钥库中已存在这些证书,请确保它们仍然有效 . 您需要将来自个人证书的所有证书从验证链一直到密钥库中存在的根目录,以便它了解如何验证凭据 .
你所描述的正是我在使用
cmd.exe
和普通用户时所获得的,尽管是Windows Server上的管理组成员 . 您必须在管理模式下启动cmd.exe
才能将更改应用于cacerts文件 . 至少在Win2k8 OS上 .如果你不这样做,插入符将在
keytool.exe -list
视图中显示新添加的证书,但Tomcat不会看到它们 . 不知道为什么会这样 . 但是当您使用cmd.exe添加它时,管理员Tomcat可以使用新添加的证书 .您还可以使用
Djavax.net.debug="ssl,handshake"
查看Tomcat从cacerts文件中读取的内容 .在我的情况下,在我弄清楚出了什么问题之前我查看了很多东西......我将证书添加到不同的密钥库,我在链中添加了所有证书(这是毫无意义的顺便说一句),我为了自己的理智再次下载了证书并检查序列号,甚至检查下载的证书,以确保它具有所有正确的信息 .
我最终编写了一个TLS验证客户端应用程序来调试问题 . 我连接的远程服务器不仅仅支持TLS 1.2(在我的Java 7版本中默认禁用),服务器也不支持在我的客户端中启用的任何密码 . 事实证明,Java 7启用的支持密码不到一半,其中许多是非常不安全的,而一些最安全的密码被禁用 .
经过一些交叉检查,我想出了以下有序的TLS 1.2支持的安全密码列表:
如果有任何加密专家,请随时更新此列表 . 我使用Qualys SSL Labs,this Information Security SE answer和IANA作为我的来源 .
对于那些想要我使用的源代码示例的人,请参阅下文 . 我使用的是Apache Commons HttpClient 3.0,因此您可能需要下载以下二进制文件:
https://archive.apache.org/dist/httpcomponents/commons-httpclient/3.0/binary/commons-httpclient-3.0.1.zip
https://archive.apache.org/dist/commons/logging/binaries/commons-logging-1.0.4.zip
https://archive.apache.org/dist/commons/codec/binaries/commons-codec-1.3.zip
https://archive.apache.org/dist/commons/lang/binaries/commons-lang-2.6-bin.zip
TLS12SocketFactory.java
Main.java