如何通过命令行将 CSR 回复导入我的密钥对?

Posted

技术标签:

【中文标题】如何通过命令行将 CSR 回复导入我的密钥对?【英文标题】:How do I import a CSR reply back into my key-pair via command line? 【发布时间】:2021-10-04 18:27:05 【问题描述】:

我使用keytool -genkeypair 命令创建了一个带有初始密钥对的密钥库,然后使用keytool -certreg 命令生成了 CSR,然后由我们的 CA 签名。现在我收到了 CSR 回复 myCSRreply.cer,如何将 CSR 回复与我的原始密钥对合并?

我尝试使用 keytool -import 命令将 CSR 回复简单地导入到我的密钥库,但这并没有改变我原来的密钥对。它只是将 CSR 回复添加为另一个条目。我希望它能够更改我原始密钥对的颁发者和指纹。

我可以通过 KeyStore 资源管理器执行我想要实现的操作,如下面的屏幕截图所示,但我需要知道如何在命令行中执行此操作。

如果我尝试导入指定 CSR 回复文件和原始密钥对别名的位置,则会收到以下错误。

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

我用来将 CSR 导入到生成该错误的密钥对中的命令:

keytool -keystore myKeyStore.pfx -importcert -file myCSRreply.cer -alias mykeypair

问题

    如何通过命令行将CSR reply 重新导入我的密钥对,以便将CSR reply 的指纹和颁发者作为我原始密钥对的新属性? (我只是假设这是预期的结果,因为当我使用获取其指纹的私钥生成 JWT 时,身份验证失败) CSR reply 是否真的要更改生成 CSR 的密钥对的指纹和颁发者属性?

【问题讨论】:

【参考方案1】:

您正在执行的命令很好。您没有新证书的完整证书链。

当您生成 mykeypair 密钥对时,keytool 将 mykeypair 的公钥包装在自签名证书中。 (这就是为什么您必须在生成期间提供其到期日期和其他详细信息。)结果,它自己形成了一个完整的证书链;这是一个根证书。 keytool 总是希望每个证书都有完整的证书链。

当您尝试导入 CSR 回复时,您正在导入新证书。这时候keytool会尝试为它建立一个证书链。 keytool 将搜索密钥库和信任库,直到找到受信任的根证书。如果做不到,导入就会失败。

阅读以下文档:

为 CA 导入证书

您现在需要将自签名证书替换为证书链,其中链中的每个证书都会验证链中前一个证书的签名者的公钥,直至根 CA。

在从 CA 导入证书回复之前,您的密钥库或 cacerts 密钥库文件中需要一个或多个受信任的证书。请参阅命令中的 -importcert。

如果证书回复是证书链,那么您需要链的顶部证书。验证 CA 公钥的根 CA 证书。

如果证书回复是单个证书,那么您需要颁发 CA(签署它的 CA)的证书。如果该证书不是自签名证书,则您需要为其签名者提供证书,依此类推,直至自签名根 CA 证书。

...

您导入证书有两个原因:将其添加到受信任的证书列表中,以及导入从证书颁发机构 (CA) 收到的证书回复,作为向该 CA 提交证书签名请求的结果(请参阅命令中的 -certreq 选项)。

keytool Documentation

【讨论】:

我实际上知道需要导入证书链。我只需要知道如何在命令行中执行此操作。我正在使用的 GUI 工具可能会自动导入证书链。但令人惊讶的是,一旦它导入了链,您将不会看到导入的新证书。可能在导入 CSR 回复时,它首先导入链,然后在导入 CSR 回复后删除证书链。但当然,这只是我的假设,因为我想不出任何解释 GUI 工具是如何做到的。 不过,这不取决于 KSE 或 keytool。检查 CA 回复。 CA 是否回复了单个证书或证书链? 导入 CA 回复后,原始自签名证书将被替换。保留它是没有意义的。这违背了首先签署它的目的。 另外,如果根 CA 是公共 CA,您可能需要在导入期间使用 -trustcacerts 选项。

以上是关于如何通过命令行将 CSR 回复导入我的密钥对?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用命令行将单个表导入mysql数据库

通过命令行将csv导入mysql

如何通过命令行将 iOS 应用上传到应用商店

在 Windows 中自动/脚本/命令行将 .pem 密钥文件转换为 .ppk

如何通过 PuTTy 使用命令行将文件从 Windows 机器上传到 Linux 机器?

MariaDB vs Mysql 通过命令行导入macosx