密钥工具错误:java.lang.Exception:从回复中建立链失败

34

生成密钥库:

keytool -genkey -alias tomcat -keyalg RSA -keystore my.keystore -keysize 2048

生成证书签名请求 (CSR):

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

然后我去我的托管提供商那里获取一些证书,并按以下方式安装它们:

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

当我安装最终证书(my.crt)时,我收到了以下错误:

keytool error: java.lang.Exception: Failed to establish chain from reply

我相信我已经按正确顺序导入了链,所以我对这条消息感到非常困惑。有人能看出我做错了什么吗?


可能是导入证书作为PrivateKeyEntry的重复问题。 - user207421
@user207421,这个问题的时间早于你所链接的那个。新的问题才是重复的,而不是旧的那个。虽然我不会说你所链接的问题是这个问题的副本。 - Edd
7个回答

27

我刚刚发现,Godaddy 提供的证书文件都是中间证书(实际上它们看起来是同一张中间证书)。

通过双击我的证书并查看证书路径,我得到了正确的根证书和中间证书... 从这里我还可以下载每个证书并使用问题中使用的步骤导入它们。

输入图片说明


4
我访问了 https://certs.godaddy.com/repository ,下载了 "gdroot-g2.crt" ,安装后,便可以安装我的证书了。 - Jonesome Reinstate Monica
似乎原因是keytool没有导入包中的所有证书。 - Frank Henard
1
这个线程已经多次帮助了我。当你获得证书时,godaddy 给你的压缩包中包含两个中间证书(你只需要其中一个)和你的证书。但它缺少根证书。这是他们的失误。 - Jonesome Reinstate Monica

22

我曾经遇到同样的问题,大约花了两周的时间才找到解决方法。问题在于来自Godaddy的根证书和中间证书不是我需要的那些。我多次在Godaddy的存储库中查找,但未能找到合适的证书。

我在我的笔记本电脑上(使用Windows 8.1)查看了我的证书。在那里,我看到了证书链,并且能够导出根证书和中间证书。然后,我将它们导入到我的密钥库中,这样就可以正常工作了。

按照以下步骤操作:

  1. 在运行Windows的计算机上查看您的证书。您将能够在第三个选项卡中看到证书链,它看起来如下所示的图像。enter image description here

  2. 从链中选择根证书,然后单击“查看证书”按钮。

  3. 打开一个新窗口,转到第二个选项卡,然后单击“保存文件”按钮。这将为您的证书打开一个导出向导。
  4. 在导出时,选择X.509 base 64选项并按照说明操作。保存文件。
  5. 中间证书重复相同步骤。
  6. 将两个证书上传到您的服务器,并按顺序导入到密钥库中-首先是根证书,然后是中间证书,最后是您的证书。[不需要导入根证书]

注意: 在我导入这些证书之前,我必须删除我的密钥库中无法正常工作的证书。为此,我使用了以下说明:

keytool -delete -alias [root] -keystore [keystore file]

如果您不确定 keytool 中包含了什么内容,可以使用以下命令查看:

keytool -list -v -keystore your_keystore_file
keytool -list -keystore [keystore file]

1
这是我能找到的最好的答案!谢谢。 - caot
我按照您的说明成功地从提供的证书中提取了中间证书,非常感谢。 - srlgrg
对于任何给定的证书(或签名响应),可以使用 openssl 获取 CA 颁发者 URI。例如,对于由 https://www.cnn.com 使用的证书,在将文件保存为 cnn.com.pem 后,通过运行 openssl x509 -in cnn.com.pem -noout -text|grep 'CA Issuers' 命令,您将获得 "CA Issuers - URI: http://secure.globalsign.com/cacert/gsatlasr3dvtlsca2022q1.crt"。显然,如果您下载颁发者-CA 证书并使用此中间/颁发者证书遵循完全相同的方法,您将获得更高一级的证书,以此类推。 - idrositis

18

在Linux环境下,当我尝试导入 CA 认证证书到密钥库时,出现了相同的错误。

我按照一系列步骤成功地导入了它们。

收到 CA 认证证书后,请按照以下步骤将证书导入密钥库。

步骤1:

使用以下命令将根证书导入到 cacerts 中,该文件将位于 JAVA_HOME/jre/lib/security 文件夹中:

keytool -importcert -alias root -file [root certificate] -keystore cacerts

输入上述命令后,它会提示您输入密码,请输入密码并点击“是”。

步骤2:

使用以下命令导入根证书:

keytool -importcert -alias root -file [root certificate] -keystore [keystore file name]

当您输入上述命令时,它会提示输入密码,请输入密码并点击“是”。

步骤3:

使用以下命令导入中间证书:

keytool -importcert -alias intermediate -file [intermediate certificate] -keystore [key store file name]

步骤 4:

使用以下命令导入站点证书:

一旦您输入上述命令,它将提示您替换已有的证书,请输入“yes”。

注意:中间证书是可选的,可以忽略,因为它随根证书一起提供。

keytool -trustcacerts -importcert -alias [alias name which give during keystore creation] -file [site certificate] -keystore [key store file name]

这些命令是在Java 7版本环境下执行的,证书由GODADDY发行。

如需更多信息,请参考网站:http://docs.oracle.com/javase/7/docs/technotes/tools/windows/keytool.html#importCertCmd


1
除非您有自签名的根CA,或者您的系统过时了,否则您不需要在(全局)cacerts文件下添加任何内容。导入中间CA证书并使用-trustcacerts应该足够了。 - idrositis

3
为解决此问题,请在keytool命令中使用额外的开关(-trustcacerts)。
从intermediate.cer文件导入中间证书到certificates.ks密钥库文件的命令应该如下所示:
keytool -storetype JCEKS -storepass passwd -keystore certificates.ks -import -alias intermediate -trustcacerts -file intermediate.cer 从http.cer文件导入证书到certificates.ks密钥库文件的命令应该如下所示:
keytool -storetype JCEKS -storepass passwd -keystore certificates.ks -import -alias http -trustcacerts -file http.cer 重新尝试完成签名SSL证书的创建和导入过程。

1

下载证书链,将其打开在Windows上 - 它存储了CA证书和来自CA的您的证书答复。

首先将CA证书导入到您的密钥库中,然后再导入来自CA的答复。


对我来说,这是因为使用了已经存在于密钥库文件中的相同别名名称。 - Devendra Singraul

0

Tomcat 7.0的正确步骤是:

步骤1. 生成密钥库

keytool -keysize 2048 -genkey -alias tomcat -keyalg RSA -keystore tomcat.keystore

步骤2. 生成CSR文件

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

步骤3. 使用类似GoDaddy的证书提供商的CSR文件生成证书并下载证书。

步骤4. 下载证书并首先导入Bundle Crt keytool -import -alias intermed -keystore tomcat.keystore -trustcacerts -file gd_bundle-g2-g1.crt

步骤5. 下载证书并导入主要证书。 keytool -import -alias tomcat -keystore tomcat.keystore -trustcacerts -file f4edf60egajgfafgaf.crt

检查密钥库是否被正确包含的命令

keytool -list -keystore tomcat.keystore


-1
在将证书导入本地密钥库之前,请务必完成以下步骤。从 CA 收到签名证书后,需要将根证书导入到 cacerts 中,该文件位于 JAVA_HOME/jre/lib/security 文件夹中,使用以下命令进行操作:
keytool -importcert -alias root -file [root certificate] -keystore cacerts
输入上述命令后,系统会提示输入密码,请输入密码并点击“是”。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接