我有三个基于Java的Web应用程序app1,app2和app3正在制作中。所有3个都经过验证的CA验证,并托管在3个不同的Web服务器上 并在https。 app1,app2由安全trust.app3验证,由trustwave验证。
下面是证书证书的层次结构,我可以看到我通过网络浏览器点击这些应用程序中的任何一个。
app1,app2证书hirerarchy是相同的.e
Entrust.net Secure Server Certification Authority---> SecureTrust CA------->*.myAppDomain.com
app3证书hirerarchy
Entrust.net Secure Server Certification Authority---> SecureTrust CA------->TrustWave Organization Validation CA, L------->*.myApp3.com
现在当app1连接到app2时,工作正常。但是当app1连接到app3时会出现异常
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
现在我在web服务器托管app1上的jdk里查看了cacert文件(即信任存储)。我试图找到Entrust,SecureTrust,TrustWave的条目,但发现只有像entrustevca,entrust2048ca等条目。所以,如果我按照逻辑说,如果根证书(这是应用程序app2和app3的Entrust)位于信任存储区联系应用程序(app3),我可以在app3上的cacert文件中看到,然后我不应该在app1尝试通过httpsURLConnection联系app3时得到上述错误。 我没有得到这个原因?我不确定我们是否还需要包含trustwave,虽然根证书即Entrust已经在内部验证了trustwave吗?
如果我需要在app3上的cacert文件中包含trustwave证书(由app2使用),那么通过该逻辑我也应该包括 在app3上的cacert文件中的securetrust(由app2使用),但它工作正常吗?
答案 0 :(得分:3)
客户端的信任库不信任服务器的证书。因此,客户端信任库中没有可信CA证书与服务器提供的证书链中的任何内容相匹配。因此证书链不完整。您需要将CA提供的所有导入到服务器的密钥库中。