需要帮助调试Tomcat中的SSL握手问题。

4

我有一个非常奇怪的问题,需要一些提示。我收到了客户发送的证书,需要安装才能访问HTTPS webservice。该证书已经在Windows和Linux操作系统中安装,使用keytool命令。

keytool -import -alias ca -file somecert.cer -keystore cacerts –storepass changeit

当我在Windows Tomcat上部署应用程序时,可以与HTTPS Web服务器通信。但是Linux Tomcat给了我一个错误:
“Caused by:sun.security.provider.certpath.SunCertPathBuilderException:无法找到请求目标的有效证书路径,在sun.security.provider.certpath.SunCertPathBuilder.engineBuild(SunCertPathBuilder.java:236)中 at java.security.cert.CertPathBuilder.build(CertPathBuilder.java:194) atsun.security.validator.PKIXValidator.doBuild(PKIXValidator.java:216)”
这意味着它找不到证书。证书位于Java安全性cacerts中。我使用了“keytool-list”命令并且它在那里。
不知道为什么在Windows上可以工作,而在Linux上不能。我已经尝试在我的Servlet中设置参数。
System.setProperty("javax.net.debug", "all"); 
System.setProperty("javax.net.ssl.trustStore", "/usr/java/jdk1.5.0_14/jre/lib/security/cacerts"); 
System.setProperty("javax.net.ssl.trustStorePassword", "changeit"); 

它仍然无法工作。

我的问题是:

1.有人知道为什么这不起作用吗?我已经尝试了所有的方法?

2.如何启用Tomcat的SSL调试。设置System.setProperty("javax.net.debug", "all")是否有效?出于某种原因,我在Catalina.out中看不到任何SSL调试信息。我需要改变其他东西吗?我应该看到哪种类型的调试信息。

非常感谢您的帮助,我已经没有任何想法了。


你在Tomcat中配置了SSL吗?默认情况下它不会运行。 - Brian
Tomcat中是否有SSL客户端?如果有,我认为它正在运行,因为我有其他正常工作的HTTPS通信。只有这一个不起作用。您能帮我检查它是否在运行吗?Tomcat在此处是客户端。我知道对于Tomcat SSL服务器,有一些配置。 - user1088352
1
你能澄清一下“我有客户端发送的证书”这句话吗?你是在谈论客户端证书吗?听起来你的应用程序(在Tomcat中运行)是一个客户端,连接到另一个服务器(因此与Tomcat本身关系不大)。是这种情况吗? - Bruno
这正是您所说的,布鲁诺。我的应用程序(在Tomcat中运行)是一个客户端,连接到另一个服务器(因此与Tomcat本身关系不大)。该应用程序是一个WAR文件部署在Tomcat上。Tomcat使用我已经安装了证书的JRE 5。 - user1088352
1
有什么提示可以帮我调试这个问题吗?或者如何启用SSL调试? - user1088352
你能百分之百确认是Web服务器出了问题,而不是应用程序拒绝接受证书吗? - Brian
2个回答

6
为了解决这个问题,你可以尝试以下方法:

下载 SSLPoke.java 文件

SSLPoke.java

编译它:

javac SSLPoke.java 

一旦你编译代码,调用SSLPoke如下:

java -Djavax.net.debug=all SSLPoke [your https host] 443

在输出中,您将看到Java正在查找cacerts的位置。
一旦您知道确切的位置,请使用keytool将您的文件导入cacerts。
keytool -import -alias [your https host] -keystore [the location returned]/cacerts -file [your.crt]

就是这样,重新启动Tomcat,它应该能正常工作。

有时候,当您在同一台Linux机器上拥有大量Java版本时,即使将[your.crt]添加到debug返回的cacerts中也无法生效。如果是这种情况,请将[your.crt]添加到Linux机器上所有的cacerts中。您可以通过以下方式找到它们:

locate cacert

一旦Linux机器返回所有cacerts的位置,例如:

/home/xuser/NetBeansProjects/porjectx/conf/cacerts
/opt/otherlocation/j2sdkee1.3.1/lib/security/cacerts.jks
/opt/icedtea-bin-6.1.12.7/jre/lib/security/cacerts
/opt/icedtea-bin-6.1.13.5/jre/lib/security/cacerts
/opt/icedtea-bin-7.2.4.1/jre/lib/security/cacerts
/opt/oracle-jdk-bin-1.7.0.76/jre/lib/security/cacerts
/opt/sun-j2ee-1.3.1/lib/security/cacerts.jks

使用keytool将[your.crt]添加到所有内容中,然后重新启动tomcat。

如果您没有文件[your.crt],可以使用以下命令获取:

openssl s_client -connect [your https host]:443 < /dev/null

然后从-----BEGIN CERTIFICATE-----复制到-----END CERTIFICATE-----

我希望这能帮助您。


你让我的一天变得美好 :) - Vijay

0
你是否检查了证书本身,以查看证书路径中是否缺少任何根证书?
此外,请记住,如果您指向Java的内置cacerts并且要更新Java,则您的证书将被覆盖。出于这个原因,我通常使用备用密钥库位置。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接