Java 需要帮助调试tomcat中的SSL握手吗

Java 需要帮助调试tomcat中的SSL握手吗,java,tomcat,ssl,certificate,Java,Tomcat,Ssl,Certificate,我有一个非常奇怪的问题,正在寻找一些提示。我有一个客户端发送的证书,我需要安装它,以便访问HTTPS Web服务。该证书已在windows和Linux操作系统中安装。使用keytool命令 keytool -import -alias ca -file somecert.cer -keystore cacerts –storepass changeit 在windows tomcat中部署应用程序时,我可以与HTTPS web服务器通信。但是Linux tomcat给了我一个错误: 原因:su

我有一个非常奇怪的问题,正在寻找一些提示。我有一个客户端发送的证书,我需要安装它,以便访问HTTPS Web服务。该证书已在windows和Linux操作系统中安装。使用keytool命令

keytool -import -alias ca -file somecert.cer -keystore cacerts –storepass changeit
在windows tomcat中部署应用程序时,我可以与HTTPS web服务器通信。但是Linux tomcat给了我一个错误:

原因:sun.security.provider.certpath.SunCertPathBuilderException: 在上找不到请求目标的有效证书路径 SunCertPathBuilder.engineBuild(SunCertPathBuilder.java:236) 位于java.security.cert.CertPathBuilder.build(CertPathBuilder.java:194) 在 sun.security.validator.PKIXValidator.doBuild(PKIXValidator.java:216)

这意味着它找不到证书。该证书位于java安全认证中心。我使用了
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.Ss设置启用SSL调试
System.setProperty(“javax.net.debug”,“all”)
工作?出于某种原因,我在Catalina.out中没有看到任何SSL调试信息。我是否需要更改其他内容。我应该看到什么样的调试信息


如果需要任何帮助,我将束手无策。

要解决此问题,您可以尝试以下方法

下载SSLPoke.java

编译它:

javac SSLPoke.java 
编译代码后,调用SSLPoke作为

java -Djavax.net.debug=all SSLPoke [your https host] 443
在输出中,您将看到java在哪里寻找Cacert

知道确切位置后,使用keytool将文件导入cacerts

keytool -import -alias [your https host] -keystore [the location returned]/cacerts -file [your.crt]
就这些,重新启动tomcat,它必须正常工作

有时,当您在同一台Linux机器上有很多java版本时,即使将[your.crt]添加到调试返回的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_客户端-连接[您的https主机]:443

并从------开始证书------复制到------结束证书-----


我希望这对您有所帮助

您是否检查了证书本身,以查看证书路径中是否缺少任何根证书


另外,请记住,如果您指向Java的内置cacerts并转到更新Java,您的证书将被覆盖。出于这个原因,我通常使用备用密钥库位置。

您在Tomcat中配置了SSL吗?默认情况下它没有运行。tomcat中是否有SSL客户端,如果有,我认为它正在运行,因为我有其他工作正常的HTTPS通信。只有这个不行。你能帮我检查一下它是否在运行吗。Tomcat是这里的客户。我知道tomcat SSL服务器有soem配置,您能否澄清“我有一个由客户端发送的证书”?你是在说客户端证书吗?听起来您的应用程序(在Tomcat中运行)是一个连接到另一台服务器的客户机(因此与Tomcat本身没有什么关系)。是这样吗?这正是你说的布鲁诺。我的应用程序(在Tomcat中运行)是一个连接到另一台服务器的客户机(因此与Tomcat本身没有什么关系)。这个应用程序是一个基于tomcat的WAR文件。tomcat使用我已安装的JRE 5,有什么提示我如何调试它吗?或是你让我开心的一天:)