OpenSSL 和 keytool 的区别

信息安全 tls openssl 爪哇
2021-08-17 14:15:13

我想知道使用 OpenSSl 或 Keytool 与由它们生成证书之间的区别。我认为 Java 社区使用 Keytool,但对于没有远程连接到 Java 的人来说,使用 OpenSSL 来生成东西。我的意思是公钥、私钥和证书。

我假设使用 OpenSSL 您必须单独生成密钥和证书,但keytool可以生成一个密钥库,该密钥库将为您提供一种可以包含密钥+证书的公文包。

问题是:我认为正确与否?

如果重要的话,我使用窗户。我指的是:如何将 OpenSSL 与 Java Keytool 一起使用?

3个回答

简而言之,它们都是加密密钥生成工具,但 keytool 具有操纵 Java 首选密钥存储文件格式 KeyStore 的附加功能。

Java 非常喜欢使用存储在 KeyStore 中的密钥和证书(当它只有证书时也称为 TrustStore)。让 Java 与简单的 PEM/CER/CRT/PKCS/etc 文件一起工作是可能的,但并非微不足道,因此,如果您在 Java 中编码加密,则出于所有意图和目的,您将使用 KeyStore。

Keytool 是 Java 附带的与 KeyStore 一起使用的工具——它可以创建 KeyStore并在其中操作密钥和证书。它还可以创建密钥签署证书因此,它既是密钥生成工具,又是密钥库文件管理工具。

OpenSSL 适用于标准格式(PEM/CER/CRT/PKCS/etc),但不处理 KeyStore 文件。可以使用 OpenSSL 生成密钥和/或证书,然后使用 keytool 将该密钥/证书导入 KeyStore,但您不能使用 OpenSSL 直接将密钥/证书放入 KeyStore。

(OpenSSL 还具有比 keytool 更广泛的功能 - 执行对称加密,充当 SSL 网络客户端和服务器,处理更多格式。只是碰巧不会说 KeyStore。)

OpenSSL 和 keytool 都有相同的目的:生成/存储密钥和证书(链)。问题是 Java 只能使用其密钥库 (JKS) 中包含的证书/密钥。这些证书和密钥是使用 keytool 库生成的,而不是使用 openssl 生成的。

正如您正确指出的那样,keytool 将始终需要一个密钥库来存储它生成的证书和密钥,而 openssl 则不是这种情况。请注意,OpenSSL 也可用于创建类似的容器,即 PKCS12 (.p12)。这是一个包含密钥和证书的受密码保护的容器(就像 Java 的密钥库一样)。但是,它与 Java 不兼容……您需要将 .p12 容器转换为 .jks,然后您的 Java 应用程序才能处理证书。

最常见的 Java Keytool Keystore 命令

Java Keytool 将密钥和证书存储在所谓的密钥库中。默认情况下,Java 密钥库作为文件实现。它使用密码保护私钥。

而 OpenSSL 生成第一个RSA 私钥(使用 3DES 加密并以 PEM 格式存储的 1024 位 RSA 密钥,以便它可以作为 ASCII 文本读取)。之后,证书( CSR ) 被创建。