java.lang.Exception:答复和密钥库中的公共密钥不匹配
问题内容:
我必须访问端口443上托管的Web服务。服务提供商已与我们共享了三个证书。
- ABCD.cer
- CA_Certificate.cer
- CCA_Certificate.cer
我必须通过为SSL通信创建表单链将它们添加到密钥库中。我遵循以下步骤。
-
keytool -keystore npci_keystore_test.jks -genkey -alias npci_client_testore
Result :- keystore npci_keystore_test.jks created.
-
keytool -import -keystore npci_keystore_test.jks -file CA_Certificate.cer -alias theCARoot
Result :- certificate CA_Certificate.cer is added to keystore.
-
keytool -import -keystore npci_keystore_test.jks -file CCA_Certificate.cer -alias theCCARoot
Result :- certificate CCA_Certificate.cer is added to keystore.
-
keytool -import -keystore npci_keystore_test.jks -file ABCD.cer -alias npci_client_testore
在步骤4中,我有以下异常
输入密钥库密码:(并且当我输入密码时,我有以下异常)
keytool错误:java.lang.Exception:答复和密钥库中的公钥不匹配
我已经在SO中进行搜索了,但是到目前为止还没有运气。
我正在按照下面的源代码创建存储并在其中导入证书。
JKS密钥库
编辑: - -
我已经通过更改证书的导入顺序对其进行了测试,但到目前为止还没有运气。
问题答案:
您问题中的链接说明了如何为服务器创建SSL密钥库,这不是您想要的。您所做的是:
- 创建一个新的密钥对
- 将受信任的证书添加到密钥库
- 将另一个受信任的证书添加到密钥库
- 尝试将服务器的SSL证书作为密钥对的证书导入
步骤4失败,因为SSL证书是为完全不同的密钥对生成的。
这三个证书可能是:
- Web服务的SSL证书
- 签署SSL证书的CA证书
- 签署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客户端身份验证,则需要采取其他步骤,但是您从未提到过客户端身份验证,因此我认为这不是必需的。