我的例外的完整痕迹是:
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
首先,我想说我知道它是非常常见的例外,我尝试应用不同的解决方案,我稍后会对它们进行描述,但没有任何帮助。< / p>
所以,我在同一台机器上有两个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连接?
答案 0 :(得分:2)
truststoreFile="C:/Users/dpivovar/ssl_server.jks"
truststorePass="start123"
这些属性不存在。您必须通过系统属性设置它们。
答案 1 :(得分:0)
我通过在keystore / truststore和keystorePassword / truststorePassword中设置tomcat配置系统Java属性来解决此问题。