如何通过命令行将 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 回复导入我的密钥对?的主要内容,如果未能解决你的问题,请参考以下文章
在 Windows 中自动/脚本/命令行将 .pem 密钥文件转换为 .ppk