我有一个非常奇怪的问题,正在寻找一些提示。我有一个客户端发送的证书,我需要安装,所以我可以访问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调试信息。我是否需要更改其他内容。我应该看到哪种调试信息。
任何帮助都非常明显我没有想法。
答案 0 :(得分:2)
要解决此问题,您可以尝试以下
从谷歌下载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,那么您的证书将被覆盖。出于这个原因,我通常使用备用密钥库位置。