【问题标题】:java.lang.Exception: Public keys in reply and keystore don't matchjava.lang.Exception:回复中的公钥和密钥库不匹配
【发布时间】:2015-01-02 12:52:33
【问题描述】:

我必须访问托管在 443 端口的网络服务。服务提供商与我们共享了三个证书。

  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 Keystore

编辑:---

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

【问题讨论】:

    标签: java ssl https keytool


    【解决方案1】:

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

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

    【讨论】:

    • 但在这种情况下,密钥和证书之间不会有任何通道
    【解决方案2】:

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

    【讨论】:

    • 你的意思是首先我必须在信任库中添加根证书 CCA(在我的情况下)并在密钥库中添加休息(ABCD,CA)??
    • 不,只要你不需要客户端认证,根本不需要keystore。
    • 我实际上需要从 JAVA 客户端调用托管在 443 端口的 rest 服务(第三方),这是否意味着我只需要将所有这些证书导入到信任存储?
    • 您可以使用KeyStore Explorer 检查是否需要客户端身份验证:工具 -> 检查 SSL(不选中“启用客户端身份验证”)。如果您可以正确访问该服务,则不需要。
    【解决方案3】:

    在您导入证书的第 4 点(您收到错误:keytool error: java.lang.Exception: Public keys in reply and keystore don't match),请更改别名。别名不应为 npci_client_testore,因为它已被用作密钥库的别名。

    【讨论】:

    • 这与@RavindraRanwala 在 2016 年 7 月 1 日 3:19 提出的解决方案有何不同?
    【解决方案4】:

    在我的情况下,链中缺少“签署 CA 的根证书”。请检查您是否有适当的 ROOT CA 证书,否则从中间导出它并在密钥库中导入它。将根 CA 导入我的密钥库对我有用。

    【讨论】:

      【解决方案5】:

      我在使用 Tomcat8 托管时遇到了相同的异常错误(密钥库不匹配)。如果您在创建密钥库时输入了wrong domain nameno domain name,则需要再次重新创建密钥库文件并再次将您的 CSR 提交给您的证书颁发机构 (CA) 许可/认可/批准颁发数字签名证书(在我的情况下是老爹)。

      以下是创建密钥库文件的命令:

      keytool -keysize 2048 -genkey -alias tomcat -keyalg RSA -keystore tomcat.keystore
      keytool -importkeystore -srckeystore tomcat.keystore -destkeystore tomcat.keystore -deststoretype pkcs12
      

      (当提示要求输入名字和姓氏时,您需要输入域名,它要求完全合格的域名(FDQN),例如@987654321 @)。来自市、州和省 - do not abbreviate

      输入以下命令以创建 CSR(从与您的 tomcat.keystore 位置相同的目录):

      keytool -certreq -keyalg RSA -alias tomcat -file myFQDN.csr -keystore tomcat.keystore
      

      注意:由于之前的“密钥库不匹配”错误,我不得不从我的 Windows 控制台 (MMC) 中删除我的所有 Godaddy 证书。

      在您的证书颁发机构准备好证书文件后。下载文件并双击 2 个 .crt 文件中的每一个以在 Windows 中重新安装它们(选择在本地计算机中自动安装)。确保备份您的 tomcat.keystore 文件,然后按照与以下示例相同的顺序将这些证书文件按顺序导入到您的 tomcat.keystore 文件(从头开始):

      keytool -import -alias root -keystore tomcat.keystore -trustcacerts -file gdig2.crt.pem
      keytool -import -alias intermed -keystore tomcat.keystore -trustcacerts -file gd_bundle-g2-g1.crt
      keytool -import -alias tomcat -keystore tomcat.keystore -trustcacerts -file namewithnumbersandletters.crt
      

      确保您已更新 server.xml,然后重新启动 Tomcat

      <Connector port="80" protocol="HTTP/1.1"
          relaxedQueryChars="|{}[]%-"
          connectionTimeout="20000"
          redirectPort="443" />  
      <Connector  SSLEnabled="true" URIEncoding="UTF-8" 
          clientAuth="false" 
          keystoreFile="C:\Program Files\Java\jdk-11.0.9\bin\tomcat.keystore" 
          keystorePass="ChangeToYourPassword" 
          maxThreads="200" 
          port="443" 
          scheme="https" 
          secure="true" 
          sslProtocol="TLS"
          sslEnabledProtocols="TLSv1.2"
          ciphers="TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA, TLS_RSA_WITH_AES_128_CBC_SHA, TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA,
          TLS_RSA_WITH_AES_128_CBC_SHA256, TLS_RSA_WITH_AES_128_GCM_SHA256, TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256,
          TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256, TLS_RSA_WITH_AES_256_CBC_SHA, TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA,
          TLS_RSA_WITH_AES_256_CBC_SHA256, TLS_RSA_WITH_AES_256_GCM_SHA384, TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384,
          TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384" /> 
      

      瞧!在域上浏览时会出现锁定图标(安全连接)。

      【讨论】:

        【解决方案6】:

        当您尝试将证书导入现有 jks 文件时,会发生这种情况,该文件中已经存在相同的别名。如果要使用相同的别名,请先删除 jks 中的旧别名及其关联证书,然后导入新别名。

        1 - keytool -delete -alias <alias_name> -keystore <your jks file name>
        2 - keytool -import -alias <alias_name> -keystore <your jks file name> -file <your source cer or crt file>
        

        【讨论】:

          【解决方案7】:

          这对我有用:

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

          【讨论】:

          • 在发布已回答问题的答案之前,请确保添加新内容。然后解释为什么你的建议对你有用(这就是 stackoverflow 的用途)。
          • 这是什么?这不会为现有添加任何新内容或额外内容
          【解决方案8】:

          与@Omikron 的回答类似,我通过将TrustedRoot.crtDigiCertCA.crt 文件添加到jre/lib/security/cacerts 密钥库中解决了这个问题。

          sudo keytool -import -alias ALIAS -file TrustedRoot.crt -storetype JKS -keystore ${JAVA_HOME}/jre/lib/security/cacerts -file DigiCertCA.crt
          

          然后我可以将证书导入我自己的密钥库。

          keytool -import -trustcacerts -alias other_alias -file certificate.crt -keystore keystore.jks -keypass "password" -storepass "password1"
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2020-10-02
            • 2019-01-11
            • 1970-01-01
            • 2022-01-15
            • 1970-01-01
            • 2020-07-13
            • 1970-01-01
            • 2011-01-29
            相关资源
            最近更新 更多