如何将CA证书添加到cacerts商店以使其按预期工作?

时间:2017-10-02 16:23:10

标签: java ssl keystore ca

更新:找到解决方案后,我将问题编辑得更清楚,以备日后参考。

我从一家公司获得了一份公司(即不为人知的)CA证书,该证书为我们提供了从Java调用的Web服务。我将此CA证书添加到默认的cacerts信任存储(keytool -import -file cert.cer -alias myca -keystore jre/lib/security/cacerts),但是与服务的连接仍然失败,并且可怕的“PKIX路径构建失败”消息。我已经检查过终端服务器证书的颁发者字段与CA证书中的相同,并且有效日期也可以。

我不知道如何解释这一点。我可以想到以下原因,但我不知道哪一个是真的:

  1. 我注意到当我将终端服务器证书添加到信任存储区时,连接正常。也许设计中的cacerts不能像我期望的那样工作(即由添加的权限签署的所有证书都被认为是有效的),而是我必须将所有终端服务器证书添加到信任存储区,包括其颁发者的CA证书。 / LI>
  2. 我必须以其他方式添加CA证书 - 通过不同的命令,添加到不同的文件等。
  3. 可能CA证书不正确,keytool拒绝将其视为证书颁发机构。
  4. 也许PKIX路径构建因其他原因而失败。
  5. 如何更多地调试此问题以找到答案?

    详细说明:

    • 终端服务器证书是通配符证书
    • 没有中间证书,只有root和结束证书

3 个答案:

答案 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信任库中导入证书,原因有两个:

  • 您在安装过程中不需要另外一步来初始化全局信任存储
  • 你限制"信任"对您的应用程序而言并且不会影响在同一JVM上运行的其他应用程序(或者更好的是,如果需要,您甚至可以限制对应用程序中客户端对象的某些实例的信任)。

也许我的情景不同于你所面对的情况,所以如果我没有明白这一点,请向我投票。

答案 1 :(得分:0)

信任存储需要包含根证书(CA的证书)。

我不确定这是“最后一个我是链”的意思,但CA证书应该是服务器提供的证书链中的最后一个。

如果您的证书由知名CA签名,那么CA证书应该在信任库中,如果服务器的证书链设置正确,一切都应该正常工作。

如果您的是自签名证书,则根证书将不在信任库中,您必须添加它。

答案 2 :(得分:0)

感谢@pedrofb评论我发现PKIX路径失败的原因只是我获得的CA证书不是签署了最终证书的CA.让它变得如此复杂的是公司的巨大无能为我提供了CA证书,显然有两个CA具有几乎相同的描述(cn,o,st,c),它们仅在SN中有所不同,并且都发布了相同的通配符证书。只有在我变得超级偏执并且比较了SN之后,我才明白这个问题。