一、简介
Java KeyStore是我们在编写 Java 代码时可以使用的安全证书的容器。 Java KeyStore 保存一个或多个证书及其匹配的私钥,并使用 JDK 附带的 keytool 创建。
在本教程中,我们将结合使用 keytool 和 openssl 将 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>-----
指定编码消息的类型,常见值为 CERTIFICATE 和 PRIVATE 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
从这里开始,我们将使用 openssl 将 keystore.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. 结论
我们已经使用 keytool 、 openssl 和 PKCS#12 格式的中间阶段成功将整个 JKS 转换为 PEM 格式。我们还介绍了单独使用 keytool 转换单个公钥证书。