我在生产中有三个基于Java的Web应用程序app1,app2和app3。所有3个都由经过验证的CA验证,并托管在3个不同的Web服务器上
并在https上。
app1,app2由安全trust验证。app3由trustwave验证。

以下是证书证书的层次结构,当我通过网络浏览器访问这些应用程序中的任何一个时,都可以看到。

app1,app2证书租用相同。

 Entrust.net Secure Server Certification Authority---> SecureTrust CA------->*.myAppDomain.com

app3证书的责任是
           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

现在我看一下托管app1的Web服务器上jdk中的cacert文件(即信任存储)。我试图找到Entrust,SecureTrust,TrustWave的条目,但仅找到诸如entrustevca,entrust2048ca等条目。因此,如果我遵循逻辑,即根证书(对于应用程序app2和app3都是Entrust)位于联系application(app3),我可以在app3上的cacert文件中看到它,然后当app1尝试通过httpsURLConnection与app3联系时,我不会出现上述错误。 我不是因为这个原因吗?我不确定我们是否还需要包括trustwave,尽管根证书即Entrust已经在内部对trustwave进行了身份验证?

如果我需要在app3的cacert文件中包括trustwave证书(由app2使用),则根据该逻辑,我也应该包括
在app3上的cacert文件中的securetrust(由app2使用),但工作正常吗?

最佳答案

客户端的信任库不信任服务器的证书。因此,客户端信任库中没有与服务器提供的证书链中的任何内容匹配的受信任CA证书。因此该证书链不完整。您需要将CA随附的所有内容导入服务器的密钥库中。

10-08 02:23