【发布时间】: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 证书中的相同,并且有效期也可以。
我不知道如何解释。我能想到以下原因,但不知道哪一个是真的:
- 我注意到,当我将终端服务器证书也添加到信任存储时,连接正常。也许设计的 cacerts 不能像我预期的那样工作(即所有由添加的权威机构签署的证书都被认为是有效的),但是我必须将所有终端服务器证书添加到信任库,包括其颁发者的 CA 证书。
- 我必须以其他方式添加 CA 证书 - 通过不同的命令、不同的文件等。
- 可能 CA 证书不正确,keytool 拒绝将其视为证书颁发机构。
- 可能由于其他原因,PKIX 路径构建失败。
我怎样才能更多地调试这个问题以找到答案?
详情:
- 终端服务器证书是通配符证书
- 没有中间证书,只有根证书和最终证书
【问题讨论】:
-
PKIX 路径构建失败 - 害怕是轻描淡写
-
包含CA证书就足够了。确保添加正确的根证书。必须是叶子证书的颁发者,或者是证书链
-
@pedrofb 原来你是对的。在你的推荐之后,我变得超级偏执,将CA证书检查到最后一个字节,发现最终证书的颁发者SN和CA证书的SN虽然名称相同,但它们存在差异。我什至无法想象为我提供 CA 证书的公司的糟糕情况,因为他们必须拥有重复的 CA——我什至发现了由具有不同 SN 的 CA 颁发的同一域的证书。