PKIX路径构建错误:不确定我是否正确创建密钥库

时间:2016-06-17 20:38:48

标签: java validation security ssl

我收到以下错误:

  

javax.net.ssl.SSLHandshakeException:sun.security.validator.ValidatorException:PKIX路径构建失败:sun.security.provider.certpath.SunCertPathBuilderException:无法找到所请求目标的有效证书路径       在sun.security.ssl.Alerts.getSSLException(未知来源)       at sun.security.ssl.SSLSocketImpl.fatal(Unknown Source)       在sun.security.ssl.Handshaker.fatalSE(未知来源)       在sun.security.ssl.Handshaker.fatalSE(未知来源)       at sun.security.ssl.ClientHandshaker.serverCertificate(Unknown Source)       在sun.security.ssl.ClientHandshaker.processMessage(未知来源)       在sun.security.ssl.Handshaker.processLoop(未知来源)       在sun.security.ssl.Handshaker.process_record(未知来源)       at sun.security.ssl.SSLSocketImpl.readRecord(Unknown Source)       at sun.security.ssl.SSLSocketImpl.performInitialHandshake(Unknown Source)       在sun.security.ssl.SSLSocketImpl.startHandshake(未知来源)       在sun.security.ssl.SSLSocketImpl.startHandshake(未知来源)       在sun.net.www.protocol.https.HttpsClient.afterConnect(未知来源)       at sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect(Unknown Source)       at sun.net.www.protocol.http.HttpURLConnection.getInputStream(Unknown Source)       at sun.net.www.protocol.https.HttpsURLConnectionImpl.getInputStream(Unknown Source)       at com.towerdata.api.personalization.TowerDataApi.getJsonResponse(TowerDataApi.java:246)       at com.towerdata.api.personalization.TowerDataApi.queryByEmail(TowerDataApi.java:101)       在EmailActivityMetricsRequestor.requestTowerData(EmailActivityMetricsRequestor.java:57)       在EmailActivityMetricsRequestor.Requestor(EmailActivityMetricsRequestor.java:44)       在Main.main(Main.java:21)   引发者:sun.security.validator.ValidatorException:PKIX路径构建失败:sun.security.provider.certpath.SunCertPathBuilderException:无法找到所请求目标的有效证书路径       在sun.security.validator.PKIXValidator.doBuild(未知来源)       at sun.security.validator.PKIXValidator.engineValidate(Unknown Source)       at sun.security.validator.Validator.validate(Unknown Source)       at sun.security.ssl.X509TrustManagerImpl.validate(Unknown Source)       at sun.security.ssl.X509TrustManagerImpl.checkTrusted(Unknown Source)       at sun.security.ssl.X509TrustManagerImpl.checkServerTrusted(Unknown Source)       ......还有17个   引起:sun.security.provider.certpath.SunCertPathBuilderException:无法找到请求目标的有效证书路径       at sun.security.provider.certpath.SunCertPathBuilder.engineBuild(Unknown Source)       在java.security.cert.CertPathBuilder.build(未知来源)       ......还有23个

我做了以下事情:

  • 我更新了JRE8,认为CA可能已经老了
  • 在eclipse中将JRE8更改为我的构建路径。我第一次这样做,它解决了我的问题,我能够发出HTTP请求,直到我关闭了eclipse。之后再次出现同样的错误。
  • 通过google chrome下载了他们的root证书,并尝试通过执行以下命令将其添加到密钥库(使用Windows,在管理模式下运行cmd.exe)
  • 我也尝试在管理模式下运行Eclipse

当我获得我要求的网站安全性的详细信息时,会出现3个证书。 rootca,中间和第3。我是否需要所有这些证书才能建立有效的密钥库?如果是这样,我该怎么做。我使用下面的代码为rootca创建一个密钥库,但这并没有解决我的问题。

.\keytool -import -trustcacerts -keystore cacerts -storepass changeit -noprompt -alias alex -file C:\Users\Alex.cauthen\Documents\CA1.cer
编辑:此外,我正在调用此服务器的API,这意味着我调用了一个方法,它向我发出请求。我联系了他们的支持团队,他们说没有人遇到这个问题。我不知道这些信息是否有用。

javax.net.debug = ssl输出不成功时:

  

%%无效:[会话-1,TLS_RSA_WITH_AES_128_CBC_SHA]   main,SEND TLSv1 ALERT:致命,描述= certificate_unknown   main,WRITE:TLSv1警报,长度= 2   main,名为closeSocket()

随机成功时的输出:

  

***完成了   verify_data:{0,221,45,195,129,216,158,173,83,221,170,52}

           

%%缓存客户端会话:[Session-1,TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256]   main,WRITE:TLSv1.2应用数据,长度= 264   main,READ:TLSv1.2应用程序数据,长度= 241

2 个答案:

答案 0 :(得分:2)

您只需要导入根CA证书,并且您使用的命令行是正确的。因此,您实际上并未将该文件用作信任存储。您需要将javax.net.ssl.trustStore属性设置为其位置,或者使用已加载的SSLContext初始化TrustManager,然后从那里继续。

答案 1 :(得分:0)

所以我犯了一个非常愚蠢的错误。我没有在命令行中指定cacerts的正确路径,因此它在当前目录而不是安全文件夹中创建了一个文件夹cacerts。