例外:回复中的公钥和密钥库不匹配

时间:2014-10-02 20:01:44

标签: tomcat ssl keystore keychain keytool

keytool -import -alias tomcat -keystore keystore.jks -file secure.mysite.com.crt

  

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

我完全按照Apple技术说明中的说明进行操作 的 https://developer.apple.com/library/mac/technotes/tn2326/_index.html

这使我能够创建自己的CA身份,然后使用该CA为我的内部服务器颁发SSL证书(所有这些都通过Apple的Keychain完成)。在服务器(Tomcat 6)上,我使用keytool导入.p12(从Apple的钥匙串导出)并将其合并到一个新的.jks密钥库中后来在Tomcat中配置。一切都运转正常。

但是,我遇到的所有指南和文档even the one from Tomcat itself都说明了从keytool生成 CSR ,然后将CA的响应证书导回到.jks。我想通过证书签名请求方法做到这一点有很多原因,但我现在一直在努力让这个工作几天。

我的步骤是:

  • 如第一个链接中所述,在Apple的Keychain上创建自己的CA.
  • 如第一个链接所述,将自己的CA导出为myCA.cer

  • 来自Tomcat的服务器机器:
    keytool -genkey -alias tomcat -keyalg RSA -keystore keystore.jks
    密码: keystorepass
    租借传递: keystorepass
    名字和姓氏: secure.mysite.com
    其他信息:东西
    输入<tomcat>的密钥: keystorepass

  • keytool -certreq -alias tomcat -keyalg -RSA -keystore keystore.jks -file secure.mysite.com.csr

  • 接下来我打开Apple Keychain Access&gt; Certificate Assistant&gt; Create a Certificate For Someone Else as a Certificate Authority...

  • 我将secure.mysite.com.csr拖到所需区域
  • 选择我自己的CA,选择有效时间,提供证书信息
    通用名称: secure.mysite.com
    和其他信息
  • 确保在扩展密钥用法扩展
  • 下启用 SSL服务器身份验证
  • 确保主题备用名称扩展下的 dNSName secure.mysite.com
  • 现在我的钥匙串中有secure.mysite.com证书和私钥)。

  • 我将secure.mysite.com导出为.p12(如链接文档中所示)

  • 然后我提取证书和密钥:
    openssl pkcs12 -in secure.mysite.com.p12 -nokeys -out secure.mysite.com.crt
    openssl pkcs12 -in secure.mysite.com.p12 -nocerts -nodes -out secure.mysite.com.key

  • 最后,我试图将证书导回到密钥库
    keytool -import -alias root -keystore keystore.jks -trustcacerts -file myCA.cer
    您想要信任吗?是的 一切都好。

  • keytool -import -alias tomcat -keystore keystore.jks -file secure.mysite.com.crt

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

我尝试过使用和不导入myCA.cert 我尝试直接以secure.mysite.com格式从Keychain导出.cer 从零开始多次开始这个过程。

我在这里缺少什么?

5 个答案:

答案 0 :(得分:0)

您需要先按root的顺序安装证书,然后是中间证书,最后是您自己的个人服务器密钥。 您可以通过查看已颁发的证书并查看信息来检查链的顺序。

答案 1 :(得分:0)

根据您执行的步骤,您首先创建了一个密钥库(在其中生成了私钥),然后您尝试在密钥库中导入证书。但是在命令中你没有使用你使用openssl转换的私钥;您使用了在生成密钥库时刚刚生成的私钥。

当你拥有pfx时,你可以使用下面的keytool命令直接转换它:

keytool -importkeystore -srckeystore domain.pfx -srcstoretype pkcs12 -destkeystore name_of_the_keystore_file.jks -deststoretype jks

答案 2 :(得分:-1)

我建议使用XCA来颁发证书。它为CA,HTTPS服务器端HTTPS客户端预定义了模板,因此很容易做到你想要的。

至于密钥库,我建议使用portecle。再次,漂亮的GUI,非常容易使用。从XCA数据库导出证书并使用portecle导入它们。然后保存为jks。

答案 3 :(得分:-1)

我会说最后一个命令应该是&#34; keytool -importcert&#34;而不是你的&#34; keytool -import&#34;。

引用Java 8的文档(因为你没有提到你的Java版本)[1]

  

导入证书有两个原因:将其添加到可信证书列表中,并导入从证书颁发机构(CA)收到的证书回复,作为向该CA提交证书签名请求的结果

[1] http://docs.oracle.com/javase/8/docs/technotes/tools/unix/keytool.html#keytool_option_importcert

<强>更新

我的坏 - 命令名称无关紧要。后来在同一份文件中说,&#39; -import&#39;和&#39; -importcert&#39;是同义词。

  

此命令在早期版本中命名为-import。此版本仍支持此旧名称。新名称-importcert是未来的首选。

<强>问题:

文件secure.mysite.com.crt是否包含单个证书或证书链?

根据[1],当它是一个链条时,链条应与用户(您的)证书一起订购,然后是零个或多个CA证书。

我认为您可以从密钥库中导出公钥,并手动将其与您尝试导入的公钥进行比较。 OpenSSL具有列出证书内容的命令。

答案 4 :(得分:-1)

问题:keytool -import -alias tomcat -keystore keystore.jks -file secure.mysite.com.crt keytool错误:java.lang.Exception:回复和密钥库中的公钥不匹配

请将别名从tomcat更改为任何其他别名,因为您使用的是Keystore -genkey的相同别名