需要帮助在tomcat中调试SSL握手

时间:2011-12-08 18:56:42

标签: java tomcat ssl certificate

我有一个非常奇怪的问题,正在寻找一些提示。我有一个客户端发送的证书,我需要安装,所以我可以访问HTTPS webservice。已在Windows和Linux操作系统中安装了certifcate。使用keytool命令

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

当我在windows tomcat中部署我的应用程序时,我可以与HTTPS Web服务器进行通信。但是Linux tomcat给了我错误:

  

引起:sun.security.provider.certpath.SunCertPathBuilderException:   无法找到所请求目标的有效证书路径   sun.security.provider.certpath.SunCertPathBuilder.engineBuild(SunCertPathBuilder.java:236)     在java.security.cert.CertPathBuilder.build(CertPathBuilder.java:194)     在   sun.security.validator.PKIXValidator.doBuild(PKIXValidator.java:216)

这意味着它无法找到证书。证书是在java安全cacerts。我使用了keytool -list命令,它就在那里。

我不知道它为什么在windows而不是linux中运行。我已经尝试在My 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设置System.setProperty("javax.net.debug", "all")安装SSL debuging?出于某种原因,我在Catalina.out中看不到任何SSL调试信息。我是否需要更改其他内容。我应该看到哪种调试信息。

任何帮助都非常明显我没有想法。

2 个答案:

答案 0 :(得分:2)

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

从谷歌下载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]添加到所有cacerts上你可以在Linux机器上找到它们:

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 -----

我希望这可以帮到你

答案 1 :(得分:0)

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

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