我有一个很奇怪的问题,正在寻找一些提示。我有一个由客户端发送的证书,需要安装,以便可以访问HTTPS Web服务。该证书已在Windows和Linux OS中安装。使用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 security 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启用SSL调试。Ss设置
System.setProperty("javax.net.debug", "all")
起作用吗?由于某些原因,我在Catalina.out中看不到任何SSL调试信息。我是否需要更改其他内容?我应该看到哪种调试信息。任何帮助都使我大失所望。
最佳答案
要解决此问题,您可以尝试以下方法
从Google下载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返回的cacert中,如果是这种情况,则将[your.crt]添加到您的Linux计算机上的所有cacert中可以通过以下方式找到它们
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 -----
希望对您有帮助