Java 如何将CA证书添加到cacerts存储中,使其按预期工作?
更新:找到解决方案后,我对问题进行了编辑,使其更加清晰,以备将来参考 我从一家公司获得了一份公司(即不知名的)CA证书,该公司为我们提供了一个从Java调用的web服务。我将此CA证书添加到默认的cacerts信任存储(Java 如何将CA证书添加到cacerts存储中,使其按预期工作?,java,ssl,keystore,ca,Java,Ssl,Keystore,Ca,更新:找到解决方案后,我对问题进行了编辑,使其更加清晰,以备将来参考 我从一家公司获得了一份公司(即不知名的)CA证书,该公司为我们提供了一个从Java调用的web服务。我将此CA证书添加到默认的cacerts信任存储(keytool-import-file cert.cer-alias myca-keystore jre/lib/security/cacerts),但与服务的连接仍然会失败,并显示可怕的“PKIX路径构建失败”消息。我已经检查了终端服务器证书的issuer字段是否与CA证书中的
keytool-import-file cert.cer-alias myca-keystore jre/lib/security/cacerts
),但与服务的连接仍然会失败,并显示可怕的“PKIX路径构建失败”消息。我已经检查了终端服务器证书的issuer字段是否与CA证书中的相同,并且有效日期是否正确
我不知道该怎么解释。我能想到以下原因,但我不知道哪一个是正确的:
- 终端服务器证书是通配符证书
- 没有中间证书,只有根证书和结束证书
如果您的证书是自签名证书,则根证书将不在信任存储中,您必须添加它。在Java未将Let's Encrypt CA证书合并到其默认信任存储中时,我遇到了与Let's Encrypt signed certificates“PKIX路径构建失败”相同的问题 我的故事详细写在这里: 最后,我创建了嵌入在我的应用程序中的内部信任存储,该存储只包含根CA证书(以及备份证书),从而使Java信任成为“链的末端”服务器证书 我更喜欢创建内部应用程序信任库,而不是在主Java信任库中导入证书,原因有两个:
- 您不需要在安装过程中执行其他步骤来初始化全局信任存储
- 您可以将“信任”限制在您的应用程序上,并且不影响在同一JVM上运行的其他应用程序(或者更好的做法是,如果需要,您甚至可以将信任限制在应用程序中客户端对象的某些实例上)
也许我遇到的情况与您面临的情况不同,所以如果我没有理解要点,请不要投票给我。多亏了@pedrofb的评论,我发现PKIX路径失败的原因很简单,就是我得到的CA证书不是签署结束证书的CA。让事情变得如此复杂的是,给我CA证书的公司的无能,这两个CA显然有两个描述几乎相同的CA(cn,o,st,c),它们只在SN上不同,并且都颁发了相同的通配符证书。只有在我变得极度偏执并比较了SNs之后,我才明白问题所在。PKIX路径构建失败-恐惧是一种轻描淡写的说法,它足以包含CA证书。确保您正在添加正确的根证书。它必须是leaf证书或证书的颁发者chain@pedrofb原来你是对的。在您的推荐之后,我变得极度偏执,检查CA证书的最后一个字节,发现尽管名称相同,但最终证书中的颁发者的SN和CA证书的SN存在差异。我甚至无法想象为我提供CA证书的公司会有多么糟糕,因为他们必须有双面CA——我甚至发现CAs为同一个域颁发的证书具有不同的SN。我的服务器证书(链中的最后一个)是由一家不知名的公司CA签署的。我已经更新了问题,使其更清楚。然而,与此同时,我在问题本身的评论中得到了一个强有力的暗示,导致了一个解决方案。