【问题标题】:How to add CA certificate to cacerts store so that it works as expected?如何将 CA 证书添加到 cacerts 存储以使其按预期工作?
【发布时间】:2017-10-02 16:23:09
【问题描述】:

更新:找到解决方案后,我将问题编辑为更清晰,以供将来参考。

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

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

  1. 我注意到,当我将终端服务器证书也添加到信任存储时,连接正常。也许设计的 cacerts 不能像我预期的那样工作(即所有由添加的权威机构签署的证书都被认为是有效的),但是我必须将所有终端服务器证书添加到信任库,包括其颁发者的 CA 证书。
  2. 我必须以其他方式添加 CA 证书 - 通过不同的命令、不同的文件等。
  3. 可能 CA 证书不正确,keytool 拒绝将其视为证书颁发机构。
  4. 可能由于其他原因,PKIX 路径构建失败。

我怎样才能更多地调试这个问题以找到答案?

详情:

  • 终端服务器证书是通配符证书
  • 没有中间证书,只有根证书和最终证书

【问题讨论】:

  • PKIX 路径构建失败 - 害怕是轻描淡写
  • 包含CA证书就足够了。确保添加正确的根证书。必须是叶子证书的颁发者,或者是证书链
  • @pedrofb 原来你是对的。在你的推荐之后,我变得超级偏执,将CA证书检查到最后一个字节,发现最终证书的颁发者SN和CA证书的SN虽然名称相同,但它们存在差异。我什至无法想象为我提供 CA 证书的公司的糟糕情况,因为他们必须拥有重复的 CA——我什至发现了由具有不同 SN 的 CA 颁发的同一域的证书。

标签: java ssl keystore ca


【解决方案1】:

在 Java 未将 Let's encrypt CA 证书合并到其默认信任库中时,我遇到了同样的问题,即“PKIX 路径构建失败”和 Let's Encrypt 签名证书。

我的故事详细写在这里:http://blog.novoj.net/2016/02/29/how-to-make-apache-httpclient-trust-lets-encrypt-certificate-authority/

最后,通过创建嵌入在我的应用程序中的仅包含根 CA 证书(和备份证书)的内部信任库,我能够使 Java 信任“链的末端”服务器证书。

我更喜欢创建内部应用程序信任库而不是在主要 Java 信任库中导入证书,原因有两个:

  • 您不需要在安装过程中执行其他额外步骤来初始化全局信任库
  • 您将“信任”限制为您的应用程序,并且不会影响在同一 JVM 上运行的其他应用程序(或者更好的是,如果需要,您甚至可以将信任限制为应用程序中客户端对象的某些实例)

也许我的情况与你所面临的不同,所以如果我没有明白这一点,请给我投反对票。

【解决方案2】:

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

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

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

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

【讨论】:

  • 我的服务器证书(链中的最后一个)由不知名的公司 CA 签署。我已经更新了问题以更清楚。与此同时,我在问题本身的评论中得到了一个强有力的提示,导致解决方案。
【解决方案3】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-10-03
    • 1970-01-01
    • 2016-08-30
    • 2017-01-14
    • 1970-01-01
    • 1970-01-01
    • 2021-01-17
    • 1970-01-01
    相关资源
    最近更新 更多