【问题标题】:How do I create truststore and keystore from the signed certificate?如何从签名证书创建信任库和密钥库?
【发布时间】:2021-07-21 17:18:14
【问题描述】:

我有一个 Java 服务,需要在它上面启用 TLS。我已经生成了一个csr 请求,现在已经用公司的 CA 签署了它。所以,我现在有 server.csrservice.crt 文件。如何从中创建信任库和密钥库?谢谢。

【问题讨论】:

  • 网络上有很多文章和教程解释了如何创建这样的商店。即使在 stackoverflow.com 上也有很多问题和答案。你的研究带来了什么?
  • @Seelenvirtuose 研究什么也没带来。我看到的所有参考资料都是关于您拥有 CA 密钥的自签名证书。
  • 为什么需要信任库? JRE 通常有一个。用于创建密钥库...例如stackoverflow.com/questions/3997748/how-can-i-create-a-keystore.
  • 要生成 CSR,您必须拥有私钥。你还拥有它吗?我们可以假设在密钥库中吗?

标签: java keystore keytool truststore


【解决方案1】:

Java TLS (JSSE) 服务器需要一个由 KeyManager 对象提供的私钥和证书,或者如果您更喜欢证书和私钥,来标识自己。它只需要TrustManager 中的证书来验证客户端,如果它使用选项来请求或要求客户端身份验证,也称为客户端证书或双向或相互身份验证,这种情况很少见;它从不需要在TrustManager 中拥有自己的证书。但是,根据所使用的证书,客户端(可能在 Java 中也可能不在)可能需要服务器证书的 CA 证书,或者在极少数情况下将服务器证书本身添加到 他们的信任库。 尽管存在其他选项/方法,但KeyManager 对象和TrustManager 对象(如果使用)通常是通过读取密钥库和(可能)信任库文件来创建的。

有两种主要的方法可以为服务器创建这样的密钥库文件,不同的方法部分取决于您是否使用 CA,如果使用,使用什么以及如何使用。两者都通过生成密钥对(私有公共)然后为公共部分获取证书来工作;这可以是虚拟/自签名证书或来自 CA,在后一种情况下,正如您所描述的,它几乎总是通过创建 CSR(证书签名请求),将此 CSR 提交给 CA,并获取至少返回请求的最终实体或“叶”证书。现在几乎在所有情况下,CA 颁发的证书要正确验证都需要至少一个(有时更多)“中间”或“链”证书,这些证书也需要在服务器密钥库中进行配置; CA 可以使用多种格式和方法来提供这个(这些)链证书,并且没有单一的标准。

方法 A 是使用 Java keytool -genkeypair 已在密钥库中创建密钥对,然后 keytool -certreq 为其创建 CSR,并且当带有链的证书(如果适用)是获得将这个“回复”导入同一个密钥库,将它与已经存在的私钥结合起来。根据用于叶证书和链证书的格式,存在变化;基本上,您要么从上到下分别导入证书,以叶子结尾,要么一次导入整个链。如果这是您创建使用的 CSR 的方式,您应该查看您的“crt”文件以查看它是什么格式以及其中包含哪些数据 - 如果它是 PEM 格式(其中 jhas 可打印字符块主要是字母和带有-----BEGIN/END {something}-----形式的标题和尾行的数字查看是否有一个或多个块以及{something}是什么,以及是否有任何相关的“评论”信息在由 BEGIN/END 行形成的块之外。

方法 B 是使用其他东西,最常见的是 OpenSSL,但也有其他工具,来生成密钥对(私钥)和 CSR,然后以相同的方式使用它们来获取证书。然后,您可以使用 OpenSSL 将私钥和证书组合成一个 PKCS12 文件,该文件一个 Java 密钥库,假设您的文件都是 PEM 格式;由 OpenSSL 生成的私钥总是会被转换,并且证书通常会被转换或可以被轻松转换。如果您正在处理旧版本的 Java 或不容易处理 PKCS12 的 Java 程序,您可以使用 keytool -importkeystore 将 PKCS12 转换为 JKS,这是 Java 最初和“传统”使用的格式。

作为任一变体,您可以使用 https://keystore-explorer.org(基于 GUI 的 Java 程序)直接在/从密钥库(如 keytool)中创建密钥对和 CSR,然后导入 CA 颁发的和链证书,或将 OpenSSL 生成的私钥与 CA 颁发的证书和链证书一起导入密钥库。

所有这些方法(我很确定所有变体)都已包含在现有的 Q 中,正如评论的那样,但 As for 自签名(在开发时通常更简单,这是 StackOverflow 的主题)倾向于要更多,因此需要花费一些精力来找到关于 CA 颁发的 As(或 Qs),以及您想要的特定方法和可能的变体。试图涵盖所有可能的情况,而不知道您实际需要哪种情况,可能需要数周或数月的时间。

【讨论】:

    猜你喜欢
    • 2017-07-12
    • 2015-12-02
    • 1970-01-01
    • 2018-01-24
    • 2017-02-05
    • 2015-02-07
    • 2023-02-11
    • 2020-03-23
    • 1970-01-01
    相关资源
    最近更新 更多