【问题标题】:Tomcat / JKS / Keytool - regenerate private key?Tomcat / JKS / Keytool - 重新生成私钥?
【发布时间】:2025-12-19 03:40:06
【问题描述】:

是否可以使用 keytool 或等效工具在 .JKS 密钥库中重新生成私钥?

我已获得证书和 JKS 密钥库,但在导入证书时,用于生成 CSR 的私钥似乎已被删除。

我可以看到如何使用新的私钥创建新的密钥库,但这与 CSR 或证书不匹配。

【问题讨论】:

    标签: java ssl keytool jks


    【解决方案1】:

    不,这就是非对称加密的重点:在只知道公钥(包含在 CSR 和证书中)的情况下,无法生成私钥。

    如果您只能从 CSR 或证书重新生成私钥,那么任何人都可以冒充证书颁发给的实体。

    如果您丢失了私钥,您只需创建一个新的密钥对、提交一个新的 CSR 并获得一个新的证书。一些 CA 允许在初始证书有效期内作为合同的一部分免费进行这种类型的密钥更新。


    编辑:只是为了澄清什么是 CSR。

    要申请 X.509 证书,您必须:

    • 生成公钥/私钥对。从本质上讲,公钥可以公开分发,因为获得私钥是不够的(至少不是在合理的时间内)。
    • 将该公钥与您的身份信息一起提交给证书颁发机构。这可以使用以下方法完成:
      • 证书签名请求(CSR,PKCS#10),其中包含您的公钥和您希望在证书中包含的数据(例如您想要的主题 DN)。虽然与证书中的数据非常相似,但这些数据应该主要由 CA 用于识别请求本身,因为 CA 正常工作应该检查他们在证书中放入的内容,而不是盲目地将 CSR 变成证书。 CSR 本身使用与证书中的公钥匹配的私钥进行签名。它实际上与自签名 X.509 证书非常相似(没有颁发者信息和有效期),但不是一个。
      • SPKAC 或 CRMF 用于浏览器内证书申请。
    • 然后,CA 获取此 CSR(或等效项)并在此过程之外进行必要的验证,以审查它想要嵌入到您的证书中的信息,并颁发您的证书(通过使用自己的私钥对其进行签名)。它有效地保证了您的公钥(从 CSR 中提取)和它嵌入证书中的信息(例如您的姓名和/或该证书所属的域名)之间的绑定。它会将这个证书发回给您。

    然后您必须将此证书与与其公钥匹配的私钥一起使用。一些工具使用单独的文件执行此操作,也可以将证书导入回密钥库中的私钥条目。

    拥有没有私钥的 CSR 或证书是没有用的。您可以很容易地再次创建一个新的 CSR,但您还需要创建一个新的密钥对。 CSR 中最重要的部分是公钥,并且要拥有与之匹配的私钥。否则,您可以丢弃 CSR。

    【讨论】:

    • 谢谢布鲁诺 - 因此我认为仍然拥有用于生成私钥的原始密钥库是无关紧要的?
    • 如果您已删除密钥库中的私钥条目,则为时已晚。不过,我会仔细检查私钥是否真的不再存在。一般来说,从您为证书请求生成密钥对的那一刻起,请保留您的密钥库/私钥的备份。
    • 顺便说一句,如果你必须使用证书链,make sure you import it all at once
    【解决方案2】:

    是否可以使用 keytool 或等效工具在 .JKS 密钥库中重新生成私钥?

    可以,但要重新生成私钥和 CSR。 CSR 会提交给 CA,CA 会为您提供新的公钥。

    您可以随时使用以下命令重新导入密钥库:

    keytool.exe" -import -keystore "%JAVA_HOME%\jre\lib\security\cacerts" -file .\certificate.cer
    

    确保您还将证书导入到较新 JDK 版本的两个路径:

    C:\Program Files\Java\jdk1.6.0_31

    较新的版本还部署了单独的 JRE:

    C:\Program Files\Java\jre6

    不这样做可能会导致日志出现以下异常:

    Caused by: javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
    

    要重新生成您的私钥和 CSR,您可以使用以下命令:

    $ openssl req -new -newkey rsa:2048  -nodes -keyout private.key -out signing request.csr -config openssl.conf
    

    【讨论】:

    • CSR 本身与证书一样,包含公钥,而不是私钥。
    • CSR 是证书签名请求。作为证书的申请人,您在生成公钥/私钥对之后生成它。 CSR 本身不涉及链,仅在 CA 颁发的结果证书中。您不需要 CSR 来生成私钥,而是需要私钥来生成 CSR(因为它是使用私钥签名的)。
    • 我为我们的 PKI 一起生成了密钥:$ openssl req -new -newkey rsa:2048 -nodes -keyout private.key -out signing request.csr -config openssl.conf。两人之间没有任何交流。 CSR 提供​​给 CA,CA 提供中间证书和根证书。
    • 那是因为req -newkey 一次执行 2 个操作:密钥对生成和后续 CSR 生成。仅拥有 CSR 文件不会帮助您获得丢失的私钥文件。您当然无法使用从初始 CSR 派生的证书。
    • 是的,我在回顾我的笔记时意识到了这一点。 Bruno 是对的,您不会从 CSR 获得新的私钥。您将不得不重新生成新的 PK 和 CSR。然后,您应该能够向 CA 重新提交新的 CSR。
    【解决方案3】:

    我遇到了同样的问题(我的私钥被意外从密钥库中删除了),只有一种方法可以恢复它:用备份替换密钥库文件 (*.jks)。因此,我建议始终备份所有与 SSL 相关的文件,如果您在密钥库中错误删除任何内容,只需将文件替换为旧文件即可。

    【讨论】: