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步,我有以下例外

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

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

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

我正在关注源代码以创建商店并导入证书。 JKS Keystore

编辑: – –

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

您的问题中的链接说明了如何为服务器创建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客户端身份validation,但您从未提及客户端身份validation,则需要执行其他步骤,因此我认为没有必要。

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

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

在我的情况下,链中缺少“签署CA的根证书”。 请检查您是否拥有相应的ROOT CA证书,否则将其从Intermediate中导出并将其导入密钥库。 通过将根CA导入我的密钥库为我工作。

在4点(你得到错误: keytool错误:java.lang.Exception:回复中的公钥和密钥库不匹配 )你导入证书的地方,请更改别名。 别名不应该是npci_client_testore,因为它已经用于密钥库的别名。

这对我有用

keytool -keystore yourkeystorename -importcert -alias certificatealiasname -file certificatename.cer