java.lang.Exception:回复和密钥库中的公钥不匹配

2022-09-02 04:55:31

我必须访问托管在端口 443 的 Web 服务。服务提供商已与我们共享三个证书。

  1. abcd.cer
  2. CA_Certificate.cer
  3. CCA_Certificate.cer

我必须通过为SSL通信创建表单链来将它们添加到密钥库中。我遵循以下步骤。

  1. keytool -keystore npci_keystore_test.jks -genkey -alias npci_client_testore

       Result :- keystore npci_keystore_test.jks created.
    
  2. keytool -import -keystore npci_keystore_test.jks -file CA_Certificate.cer -alias theCARoot

       Result :- certificate CA_Certificate.cer is added to keystore.
    
  3. keytool -import -keystore npci_keystore_test.jks -file CCA_Certificate.cer -alias theCCARoot

       Result :- certificate CCA_Certificate.cer is added to keystore.
    
  4. keytool -import -keystore npci_keystore_test.jks -file ABCD.cer -alias npci_client_testore

    在步骤4,我有以下异常

    输入密钥库密码:(当我输入密码时,我有以下例外)

    keytool 错误:java.lang.异常:回复和密钥库中的公钥不匹配

我已经在SO中进行了搜索,但到目前为止没有运气。

我正在按照下面的源代码创建存储并在其中导入证书。JKS 密钥库

编辑:---

我已经通过更改证书的导入顺序对其进行了测试,但到目前为止没有运气。


答案 1

此处的问题是您在导入证书时使用的别名,该别名与您在创建 JKS 存储时使用的别名类似。只需更改别名,它就会解决您的问题。源文档 [1] 需要相应地更正。

[1] http://docs.oracle.com/cd/E19509-01/820-3503/ggfgo/index.html


答案 2

问题中的链接解释了如何为服务器创建 SSL 密钥库,这不是您要执行的操作。你所做的是:

  1. 创建新的密钥对
  2. 将可信证书添加到密钥库
  3. 将另一个可信证书添加到密钥库
  4. 尝试将服务器的 SSL 证书作为密钥对的证书导入

步骤 4 失败,因为 SSL 证书是为完全不同的密钥对生成的。

这三个证书可能是:

  1. Web 服务的 SSL 证书
  2. 签署 SSL 证书的 CA 证书
  3. 签署 CA 的根证书

您现在要做的是向信任库添加一个信任锚(默认情况下:),结果是客户端接受 Web 服务的 SSL 证书。${JAVA_HOME}/jre/lib/security/cacerts

通常,SSL 服务器在 SSL 握手期间将除根证书以外的整个链发送到客户端。这意味着您必须将根证书添加到信任库:

keytool -import -keystore ${JAVA_HOME}/jre/lib/security/cacerts -file CCA_Certificate.cer -alias theCCARoot

如果 Web 服务需要 SSL 客户端身份验证,但您从未提及客户端身份验证,因此我认为没有必要执行其他步骤。