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

时间:2015-01-02 12:52:33

标签: java ssl https keytool

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

  1. ABCD.cer
  2. CA_Certificate.cer
  3. CCA_Certificate.cer
  4. 我必须通过为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:回复中的公钥和密钥库不匹配

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

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

      修改:---

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

7 个答案:

答案 0 :(得分:28)

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

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

答案 1 :(得分:14)

您的问题中的链接说明了如何为服务器创建SSL密钥库,这不是您想要做的。你做的是:

  1. 创建新密钥对
  2. 将可信证书添加到密钥库
  3. 将另一个受信任的证书添加到密钥库
  4. 尝试将服务器的SSL证书导入为密钥对的证书
  5. 步骤4失败,因为SSL证书是为完全不同的密钥对生成的。

    这三个证书可能是:

    1. 网络服务的SSL证书
    2. 签署SSL证书的CA证书
    3. 签署CA的根证书
    4. 您现在要做的是向信任库添加信任锚(默认情况下为:${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客户端身份验证,但您从未提及客户端身份验证,则需要执行其他步骤,因此我认为没有必要。

答案 2 :(得分:6)

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

答案 3 :(得分:3)

在我的案例中,链中缺少“签署CA的根证书”。请检查您是否拥有相应的ROOT CA证书,否则从Intermediate中将其导出并将其导入密钥库。将根CA导入我的密钥库对我有用。

答案 4 :(得分:1)

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

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

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

(提示提示您输入名字和姓氏时,您需要输入域名,它要求输入完全合格的域名(FDQN),例如www。 example.com)。来自城市,州和省-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="8080" protocol="HTTP/1.1"
            connectionTimeout="20000"
            redirectPort="443" />  
    <Connector 
    URIEncoding="UTF-8"
    SSLEnabled="true" 
    clientAuth="false"
    keystoreFile="C:\Program Files\Java\jdk1.8.0_181\bin\tomcat.keystore" 
    keystorePass="changeme" 
    maxThreads="200" 
    port="443" 
    scheme="https" 
    secure="true" 
    sslProtocol="TLS" />

Voilà!在域上浏览时,将显示“锁定”图标(安全连接)。

答案 5 :(得分:0)

这对我有用:

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

答案 6 :(得分:0)

类似于@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"