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


问题内容

我必须访问端口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.Exception:答复和密钥库中的公钥不匹配

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

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

编辑: - -

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


问题答案:

您问题中的链接说明了如何为服务器创建SSL密钥库,这不是您想要的。您所做的是:

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

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

这三个证书可能是:

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

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

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

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

如果Web服务需要SSL客户端身份验证,则需要采取其他步骤,但是您从未提到过客户端身份验证,因此我认为这不是必需的。