我必须访问托管在端口 443 的 Web 服务。服务提供商已与我们共享三个证书。
- ABCD文件
- CA_证书.cer
- CCA_证书.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 密钥库
编辑: - -
我已经通过更改证书的导入顺序对其进行了测试,但到目前为止还没有成功。
原文由 dReAmEr 发布,翻译遵循 CC BY-SA 4.0 许可协议
您问题中的链接解释了如何为服务器创建 SSL 密钥库,这不是您想要做的。你所做的是:
第 4 步失败,因为 SSL 证书是为完全不同的密钥对生成的。
三个证书大概是:
您现在要做的是将信任锚添加到您的信任库(默认情况下:
${JAVA_HOME}/jre/lib/security/cacerts
),结果是您的客户端接受 web 服务的 SSL 证书。通常,SSL 服务器在 SSL 握手期间将除根证书之外的整个链发送给客户端。这意味着您必须将根证书添加到您的信任库:
如果 web 服务需要 SSL 客户端身份验证,则需要执行其他步骤,但您从未提及客户端身份验证,因此我认为没有必要。