繁体   English   中英

如何从签名证书创建信任库和密钥库?

[英]How do I create truststore and keystore from the signed certificate?

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

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}(s) 是什么(是),以及在 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 颁发的链证书一起导入密钥库。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM