【发布时间】:2014-08-14 10:19:13
【问题描述】:
我的异常的完整跟踪是:
javax.net.ssl.SSLHandshakeException:
sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
首先我想说,我知道这是非常常见的异常,我尝试应用不同的解决方案,我稍后会描述它们,但没有任何帮助。
所以,我在同一台机器上有两个 tomcat 7 实例。直接来说,这些实例都有自己的CATALINA_BASE目录,但是共同的CATALINA_HOME。它们也是隔离的 - 配置端口以便实例不会干扰。一个实例 - 服务器 - 带有已部署的 Web 应用程序 servlet。还有另一个客户端实例 - servlet。
这是服务器tomcat的server.xml片段:
<Connector port="8443" protocol="HTTP/1.1" SSLEnabled="true"
maxThreads="150" scheme="https" secure="true"
clientAuth="true" sslProtocol="TLS"
truststoreFile="C:/Users/dpivovar/ssl_server.jks"
truststorePass="start123"
keystoreFile="C:/Users/dpivovar/ssl_server.jks"
keystorePass="start123"/>
还有这个客户端tomcat的片段:
<Connector port="8444" protocol="HTTP/1.1" SSLEnabled="true"
maxThreads="150" scheme="https" secure="true"
clientAuth="false" sslProtocol="TLS"
truststoreFile="C:/Program Files/Java/jdk1.7.0_45/jre/lib/security/cacerts"
truststorePass="changeit"
keystoreFile="C:/Users/dpivovar/ssl_client.jks"
keystorePass="start123" />
工作流程:客户端尝试对服务器执行 GET,但出现上述异常。
证书呢。我使用了java keytool。我做了one keystore for server and separate for client。每个密钥库包含对应侧的private key 和public certificate。在上面的示例中,客户端信任库引用了 jre cacerts 密钥库,因为我发现的解决方案之一是将服务器的公共证书放入 jre cacerts。但这对我不起作用。
我发现的另一个解决方案 (http://www.nodsw.com/blog/leeland/2006/12/06-no-more-unable-find-valid-certification-path-requested-target) 通过 InstallCert 工具提供了获取服务器的公共证书,然后在客户端信任库中使用它。所以现在,在 jre caserts 中有一个服务器的公共证书,但引发了异常。
另外,我有一个简单的客户端示例-它是普通的 java 程序,通过系统属性,我设置了用于客户端的密钥库所需的路径,并且以同样的方式,我使 GET 到服务器并且它工作,握手发生,连接建立.
那么你能帮我吗,可能是什么问题,是什么阻止了部署在 tomcat 上的客户端与服务器建立 ssl 连接?
【问题讨论】:
-
任何help
-
使用
openssl s_client测试设置。请将s_client的输出作为问题的一部分发布。