解决:SunCertPathBuilderException:无法找到所请求目标的有效证书路径

时间:2014-08-14 10:19:13

标签: java tomcat ssl https

我的例外的完整痕迹是:

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 keypublic 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连接?

2 个答案:

答案 0 :(得分:2)

    truststoreFile="C:/Users/dpivovar/ssl_server.jks" 
    truststorePass="start123"

这些属性不存在。您必须通过系统属性设置它们。

答案 1 :(得分:0)

我通过在keystore / truststore和keystorePassword / truststorePassword中设置tomcat配置系统Java属性来解决此问题。