Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ssl/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jquery-ui/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何将CA证书添加到cacerts存储中,使其按预期工作?_Java_Ssl_Keystore_Ca - Fatal编程技术网

Java 如何将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证书中的

更新:找到解决方案后,我对问题进行了编辑,使其更加清晰,以备将来参考

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

我不知道该怎么解释。我能想到以下原因,但我不知道哪一个是正确的:

  • 我注意到,当我将终端服务器证书添加到信任存储时,连接正常。也许Cacert在设计上并不像我期望的那样工作(即,所有由授权机构签署的证书都被认为是有效的),但是我必须将所有的终端服务器证书添加到一个信任存储中,包括它们的颁发者的CA证书
  • 我必须以其他方式添加CA证书-通过不同的命令,到不同的文件等
  • CA证书可能不正确,KEYToT拒绝将其视为证书颁发机构。
  • 也许PKIX路径构建失败还有其他原因
  • 如何进一步调试此问题以找到答案

    详情:

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

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

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

    如果您的证书由知名的CA签名,那么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签署的。我已经更新了问题,使其更清楚。然而,与此同时,我在问题本身的评论中得到了一个强有力的暗示,导致了一个解决方案。