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

use*_*352 5 java ssl tomcat certificate

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

\n\n
keytool -import -alias ca -file somecert.cer -keystore cacerts \xe2\x80\x93storepass changeit\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n\n
\n

原因是:sun.security.provider.certpath.SunCertPathBuilderException:\n 无法在 java 处\n sun.security.provider.certpath.SunCertPathBuilder.engineBuild(SunCertPathBuilder.java:236)\n 找到请求目标的有效证书路径。 security.cert.CertPathBuilder.build(CertPathBuilder.java:194)\n at\n sun.security.validator.PKIXValidator.doBuild(PKIXValidator.java:216)

\n
\n\n

这意味着它找不到证书。该证书位于 java security cacerts。我用过keytool -list命令,它就在那里。

\n\n

我不知道为什么它在windows下运行而不是在linux下运行。我尝试在 My servlet 中设置参数

\n\n
System.setProperty("javax.net.debug", "all"); \nSystem.setProperty("javax.net.ssl.trustStore", "/usr/java/jdk1.5.0_14/jre/lib/security/cacerts"); \nSystem.setProperty("javax.net.ssl.trustStorePassword", "changeit"); \n
Run Code Online (Sandbox Code Playgroud)\n\n

它仍然不起作用。

\n\n

我的问题是:

\n\n

1.任何人都知道为什么这不起作用,我已经厌倦了一切?

\n\n

2.如何为tomcat.Ss设置启用SSL调试System.setProperty("javax.net.debug", "all")?由于某种原因,我在 Catalina.out 中没有看到任何 SSL 调试信息。我还需要更改其他内容吗?我应该看到什么样的调试信息。

\n\n

任何帮助都非常有用,我没有主意。

\n

sba*_*rto 6

要解决这个问题您可以尝试以下方法

下载SSLPoke.java

SSLPoke.java

编译它:

javac SSLPoke.java 
Run Code Online (Sandbox Code Playgroud)

编译代码后,调用 SSLPoke 作为

java -Djavax.net.debug=all SSLPoke [your https host] 443
Run Code Online (Sandbox Code Playgroud)

在输出中,您将看到 java 在哪里寻找 cacerts。

一旦您知道确切的位置,请使用 keytool 将文件导入到 cacerts

keytool -import -alias [your https host] -keystore [the location returned]/cacerts -file [your.crt]
Run Code Online (Sandbox Code Playgroud)

就是这样,重新启动tomcat,它一定可以正常工作了。

有时,当您在同一台 Linux 计算机上有很多 java 版本时,即使将 [your.crt] 添加到由 debug 返回的 cacerts 也不起作用,如果是这种情况,请将 [your.crt] 添加到您的 Linux 计算机上的所有 cacerts可以通过以下方式找到它们:

locate cacert
Run Code Online (Sandbox Code Playgroud)

一旦 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
Run Code Online (Sandbox Code Playgroud)

使用 keytool 将 [your.crt] 添加到所有文件中,然后重新启动 tomcat。

如果您没有文件 your.crt 您可以使用命令获取它

openssl s_client -connect [your https host]:443 < /dev/null

并从 -----BEGIN CERTIFICATE----- 复制到 -----END CERTIFICATE-----

我希望这对你有帮助