一、简介

Java KeyStore是我们在编写 Java 代码时可以使用的安全证书的容器。 Java KeyStore 保存一个或多个证书及其匹配的私钥,并使用 JDK 附带的 keytool 创建。

在本教程中,我们将结合使用 keytoolopenssl 将 Java KeyStore 转换为 PEM(隐私增强邮件)格式。 这些步骤包括使用 keytool 将 JKS 转换为 PKCS#12 KeyStore,然后使用 openssl 将 PKCS#12 KeyStore 转换为 PEM 文件。

keytool 随JDK一起提供,我们可以从OpenSSL网站下载 openssl

2. 文件格式

Java KeyStore 以 JKS 文件格式存储。它是一种专门用于 Java 程序的专有格式。 PKCS#12 KeyStore 是非专有的,并且越来越受欢迎 — 从 Java 9 开始,PKCS#12 被用作 JKS 上的默认 KeyStore 格式。

PEM 文件也是证书容器 - 它们使用 Base64 编码二进制数据,这使得内容可以更轻松地通过不同系统传输。一个 PEM 文件可能包含多个实例,每个实例都遵循两个规则:

  • 一行标头-----BEGIN <label>-----
  • 一行页脚-----END <label>-----

指定编码消息的类型,常见值为 CERTIFICATEPRIVATE KEY

3. 将整个 JKS 转换为 PEM 格式

现在让我们完成将所有证书和私钥从 JKS 转换为 PEM 格式的步骤。

3.1.创建 Java 密钥库

我们首先使用单个 RSA 密钥对创建 JKS:

keytool -genkey -keyalg RSA -v -keystore keystore.jks -alias first-key-pair

我们将在提示符下输入 KeyStore 密码,并输入有关密钥对的信息。

对于此示例,我们还将创建第二个密钥对:

keytool -genkey -keyalg RSA -v -keystore keystore.jks -alias second-key-pair

3.2. JKS 到 PKCS#12

转换过程的第一步是使用 keytool 将 JKS 转换为 PKCS#12:

keytool -importkeystore -srckeystore keystore.jks \
   -destkeystore keystore.p12 \
   -srcstoretype jks \
   -deststoretype pkcs12

再次,我们将回答密码提示 - 一个将询问原始 JKS 的密码,另一个将要求我们为生成的 PKCS#12 KeyStore 创建密码。

让我们检查一下运行该命令的输出:

Entry for alias first-key-pair successfully imported.
Entry for alias second-key-pair successfully imported.
Import command completed:  2 entries successfully imported, 0 entries failed or cancelled

结果是以 PKCS#12 格式存储的 keystore.p12 KeyStore。

3.3. PKCS#12 转 PEM

从这里开始,我们将使用 opensslkeystore.p12 编码到 PEM 文件中:

openssl pkcs12 -in keystore.p12 -out keystore.pem

该工具将提示我们输入 PKCS#12 KeyStore 密码和每个别名的 PEM 密码。 PEM 密码用于加密生成的私钥。

如果我们不想加密生成的私钥,我们应该使用:

openssl pkcs12 -nodes -in keystore.p12 -out keystore.pem

keystore.pem 将包含 KeyStore 中的所有密钥和证书。对于本示例,它包含 第一个密钥对第二个密钥对别名的 私钥和证书。

4. 将单个证书从 JKS 转换为 PEM

我们可以单独使用 keytool 将单个公钥证书从 JKS 导出为 PEM 格式

keytool -exportcert -alias first-key-pair -keystore keystore.jks -rfc -file first-key-pair-cert.pem

在提示符处输入 JKS 密码后,我们将看到该命令的输出:

Certificate stored in file <first-key-pair-cert.pem>

5. 结论

我们已经使用 keytoolopenssl 和 PKCS#12 格式的中间阶段成功将整个 JKS 转换为 PEM 格式。我们还介绍了单独使用 keytool 转换单个公钥证书。