我有一个很奇怪的问题,正在寻找一些提示。我有一个由客户端发送的证书,需要安装,以便可以访问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 -----


希望对您有帮助

09-10 15:01
查看更多