本文主要是介绍解决 Java 中 the Public Keys in Reply and Keystore Don‘t Match 错误,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
本篇文章讨论 keytool error: java.lang.Exception: Public keys in reply and keystore don’t match 错误。 它还强调了导致此错误的可能原因。
此外,我们将了解可用于修复此错误的不同解决方案。
keytool error: java.lang.Exception: Public keys in reply and keystore don’t match 的错误描述、原因及可能的解决方案
我们将尝试访问托管在端口 443 的 Web 服务。服务提供商共享三个证书:ABCD.cer、CCA_Certificate.cer 和 CA_Certificate.cer。
我们需要通过创建 SSL 通信的表单链将它们全部添加到 KeyStore 中。 下面按顺序给出了我们在本文中遵循的步骤。
- keytool -keystore npci_keystore.jks -genkey -alias npci_client
- keytool -import -keystore npci_keystore.jks -file CA_Certificate.cer -alias CARoot
- keytool -import -keystore npci_keystore.jks -file CCA_Certificate.cer -alias CCARoot
- keytool -import -keystore npci_keystore.jks -file ABCD.cer -alias npci_client
此时,我们收到错误消息,提示 keytool error: java.lang.Exception: Public keys in reply and keystore don’t match。 这个错误到底是怎么回事? 为什么我们会遇到这个问题?
我们遇到此问题的原因有多种,如下所示:
- 当我们尝试使用不同的密钥对生成证书时,我们会收到此错误。
- 如果我们在导入证书和创建 JKS 存储时使用相同的别名,则会出现此错误。
- 有时,以错误的顺序安装证书也会导致此错误。
- 如果链中缺少根 CA 的证书,我们也会解决此问题。
现在的重点是如何消灭它。 让我们在下一节中看看。
解决 Public Keys in Reply and Keystore Don’t Match 错误
在我们的场景中,我们使用的链接指导我们如何为服务器创建 SSL KeyStore,这不是我们想要实现的目标。 我们所做的是从创建新的密钥对开始。
接下来,我们向 KeyStore 添加一个受信任的证书,向 KeyStore 添加另一个受信任的证书,然后尝试为我们的密钥对导入服务器的 SSL 证书。
此时,我们失败了,因为生成的 SSL 证书适用于完全不同的密钥对。 我们拥有的三项证书包括:
- Web 服务的 SSL 证书
- 签署 SSL 证书的 CA 证书
- 签署 CA 的根证书
现在,我们必须将信任锚添加到我们的 TrustStore 中。 默认情况下,它是 ${JAVA_HOME}/jre/lib/security/cacerts
,结果是我们的客户端接受 Web 服务的 SSL 证书。
请记住,在 SSL 握手期间,SSL 服务器将整个链(不包括根证书)发送到客户端。 因此,我们必须将根证书添加到我们的信任库中,如下所示。
keytool -import -keystore ${JAVA_HOME}/jre/lib/security/cacerts -file CCA_Certificate.cer -alias CCARoot
如果 Web 服务需要 SSL 客户端身份验证,则一些附加步骤是必不可少的。 如果我们从未提到过客户端身份验证,那么这是不必要的。
这就是在我们的例子中修复错误的方法,但是如果我们处于不同的情况,我们可以尝试其他解决方案。
- 我们需要使用相同的实际密钥对再次生成证书以消除此错误。
- 在某些情况下,错误是由于在创建 JKS 存储和导入证书时使用相同的别名而导致的。 然后,我们需要更改别名来解决错误。
- 确保链中不缺少根 CA 的证书。
这篇关于解决 Java 中 the Public Keys in Reply and Keystore Don‘t Match 错误的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!