致命错误sun.security.validator PKIX路径构建失败

时间:2013-01-31 07:25:23

标签: tomcat ssl java

我之前遇到过这个问题,并通过更新我的JDK来解决这个问题。早些时候,当我遇到这个问题时,我使用的是默认安装,我使用Yum进行了安装,之后我从oracle下载了JDK并安装了它,并根据新的安装目录更改了默认的$ JAVA_HOME路径。现在重新发生了同样的问题,我检查了related post on the net无法找到任何修复程序。

我们使用的示例代码只是对http或https的简单身份验证。

//Http client object
HttpClient client = new HttpClient();
HostConfiguration config = client.getHostConfiguration();
client.getParams().setParameter("http.socket.timeout", new Integer(100000));


String Url = 'https://example.com/';
PostMethod method = new PostMethod(Url);

//Handler to try for 3 attempt in case of network failure
method.getParams().setParameter(HttpMethodParams.RETRY_HANDLER,
                                                                new DefaultHttpMethodRetryHandler(3, false));

//Here we are trying to connect through Httpclient method
int statusCode = client.executeMethod(method);

不确定导致此问题的原因。

    keytool -list -keystore $JAVA_HOME/jre/lib/security/cacerts
    Enter keystore password:

    Keystore type: JKS
    Keystore provider: SUN

Your keystore contains 76 entries

于2013年2月11日编辑

我做了一些测试并重新安装了我的jdk和tomcat,但仍然遇到了同样的错误。

Failure-Fatal transport error:
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

我按照URL

上的说明进行操作
java InstallCert services.example.com
Loading KeyStore jssecacerts...
Opening connection to services.example.com:443...
Starting SSL handshake...

No errors, certificate is already trusted

Server sent 1 certificate(s):

 1 Subject CN=*.example.com, OU=Domain Control Validated, O=*.example.com
   Issuer  SERIALNUMBER=04343339, CN=Go Daddy Secure Certification Authority, OU=http://certificates.godaddy.com/repository, O="GoDaddy.com, Inc.", L=Scottsdale, ST=Arizona, C=US

这表明证书已添加到cacerts中。现在这变得越来越有趣了。

3 个答案:

答案 0 :(得分:3)

最后,在成员的所有麻烦和帮助之后,我得到了解决此问题的方法。我将提供我的答案,以防将来任何一个人面临同样的问题。

服务器services.example.com使用通配符证书(在我的情况下),并且在SSL握手期间(根据我的最佳理解)没有发送完整的证书,这导致了这个问题。

要修复此类问题,我们需要将证书添加到java truststore“cacerts”。

1:我从网址http://nodsw.com/blog/leeland/2006/12/06-no-more-unable-find-valid-certification-path-requested-target下载了一段java代码 我把这个文件放在服务器上的位置“$ JAVA_HOME / jre / lib / security / cacerts”

2:我使用“javac InstallCerts.java”编译了代码,该代码创建了一个类文件。

3:然后执行以下命令为服务器“services.example.com”添加证书

java InstallCert services.example.com

Enter certificate to add to trusted keystore or 'q' to quit: [1]
1

我输入“1”将证书添加到信托文件“jssecacerts”。

4:最后我用文件“jssecacerts”替换了文件“cacerts”。 (注意:在替换之前备份这两个文件)

mv cacerts cacerts-bkp-12-Feb-2013
cp –p  jssecacerts cacerts

5:确认证书已添加到cacerts文件中。要确认它,请执行以下命令:

keytool -list -keystore $JAVA_HOME/jre/lib/security/cacerts | grep example
Enter keystore password:

services.example.com-1, Feb 12, 2013, trustedCertEntry,

6:重新启动相关服务并测试了问题,并且已修复。

答案 1 :(得分:1)

您的信任库不信任服务器证书。它是自签名的吗?您可能需要将其从服务器导出到您的信任库。

答案 2 :(得分:0)

因此,也许有人会遇到这个问题,这是一个令人沮丧的问题,我花了两天时间才能找到并解决。问题在于,JVM不信任服务器的证书,因此,解决方案是将我们的Tomcat服务器和JVM配置为信任此站点。所以我将提到解决问题的所有步骤:

  1. 通过打开与firefox的链接来下载站点的证书,然后单击绿色锁,然后单击更多信息,然后单击“安全”选项卡,“查看证书”按钮,“详细信息”选项卡,最后是“导出”按钮。让我们假设它名为server_cert.crt
  2. 将证书添加到要信任的JVM证书列表中:您应该可以通过导航到C:\ Program Files \ Java \ jre1.8.0_151 \ lib \ security来做到这一点。要更新的文件名为cacerts,因此将下载的证书server_cert.crt复制到该文件夹​​,然后在相同位置打开命令行,然后执行以下命令:
  

keytool -J-Duser.language = zh-CN -import -trustcacerts -alias somealiasexp   -keystore cacerts-文件server_cert.crt

密码更改 您应该在命令行中得到肯定的确认。 要检查是否已添加证书,请执行以下命令:

  

keytool -list -keystore cacerts -alias somealiasexp

。并显示证书。

  1. 现在让我们配置tomcat服务器以使用cacerts密钥库,进入文件夹“ C:\ Program Files \ Java \ apache-tomcat-7.0.88 \ bin”并创建文件“ setenv.bat”,然后将其复制里面的代码:
  

set JAVA_OPTS =“-Djavax.net.ssl.trustStore = C:/ Program   文件/Java/jre1.8.0_151/lib/security/cacerts”   “ -Djavax.net.ssl.trustStorePassword = changeit”

  1. 另一方面,我们必须为ssl配置一个新的端口或连接器,其中包含密钥库和证书,因此:
  2. 创建一个新文件夹,例如“ C:/ tomcatkeystore”
  3. 输入文件夹并通过在CMD上执行命令来创建新的密钥库:
  

keytool -genkey -alias tomcat -keyalg RSA -keystore tomcatkeystore.jks   执行此命令后,您将不必设置密码,我们假设它是“ some_password”。

  1. 如果您想购买受信任的证书,则必须通过执行以下命令来生成证书请求:
  

keytool -certreq -keyalg RSA -alias tomcat-文件certtomcat.csr   -keystore tomcatkeystore.jks

  1. 将下载的证书server_cert.crt复制到该文件夹​​中,然后通过执行以下命令将其添加到生成的密钥库中:
  

keytool -J-Duser.language = zh-CN -import -trustcacerts -alias somealias   -keystore tomcatkeystore.jks-文件server_cert.crt

  1. 现在通过复制以下标记来更新位于“ C:\ Program Files \ Java \ apache-tomcat-7.0.88 \ conf”文件夹中的server.xml文件:

<Connector port="443" protocol="org.apache.coyote.http11.Http11Protocol"
                   maxThreads="150" SSLEnabled="true" scheme="https" secure="true"
                   clientAuth="false" sslProtocol="TLS" 
                   keystoreFile="file:///C:/tomcatkeystore/tomcatkeystore.jks" keystorePass="some_password" />

  1. 现在最后一步是重新启动服务器 。

要测试ssl端口是否配置正确,您应该能够访问链接“ https://localhost”中的tomcat接口并为其添加例外。就是这样,我希望这对您有所帮助。