更新:找到解决方案后,我将问题编辑得更清楚,以备日后参考。
我从一家公司获得了一份公司(即不为人知的)CA证书,该证书为我们提供了从Java调用的Web服务。我将此CA证书添加到默认的cacerts信任存储(keytool -import -file cert.cer -alias myca -keystore jre/lib/security/cacerts
),但是与服务的连接仍然失败,并且可怕的“PKIX路径构建失败”消息。我已经检查过终端服务器证书的颁发者字段与CA证书中的相同,并且有效日期也可以。
我不知道如何解释这一点。我可以想到以下原因,但我不知道哪一个是真的:
如何更多地调试此问题以找到答案?
详细说明:
答案 0 :(得分:1)
我面临同样的问题" PKIX路径构建失败"使用Let的加密签名证书,Java没有将Let的加密CA证书合并到其默认信任库中。
我的故事在此处详细说明:http://blog.novoj.net/2016/02/29/how-to-make-apache-httpclient-trust-lets-encrypt-certificate-authority/
最后,我能够让Java信任"链的终点"服务器证书,通过创建嵌入在我的应用程序中的内部信任存储区,该存储区仅包含根CA证书(和备份CA证书)。
我更倾向于创建内部应用程序信任库,而不是在主Java信任库中导入证书,原因有两个:
也许我的情景不同于你所面对的情况,所以如果我没有明白这一点,请向我投票。
答案 1 :(得分:0)
信任存储需要包含根证书(CA的证书)。
我不确定这是“最后一个我是链”的意思,但CA证书应该是服务器提供的证书链中的最后一个。
如果您的证书由知名CA签名,那么CA证书应该在信任库中,如果服务器的证书链设置正确,一切都应该正常工作。
如果您的是自签名证书,则根证书将不在信任库中,您必须添加它。
答案 2 :(得分:0)
感谢@pedrofb评论我发现PKIX路径失败的原因只是我获得的CA证书不是签署了最终证书的CA.让它变得如此复杂的是公司的巨大无能为我提供了CA证书,显然有两个CA具有几乎相同的描述(cn,o,st,c),它们仅在SN中有所不同,并且都发布了相同的通配符证书。只有在我变得超级偏执并且比较了SN之后,我才明白这个问题。