将PEM文件转换为Java KeyStore格式
1. 概述
在之前的教程中,我们展示了如何将 Java KeyStore (JKS) 转换为 PEM 格式 。在本教程中,我们将 PEM 格式转换为标准 Java KeyStore (JKS) 格式。Java KeyStore 是一个容器,用于存储证书及其匹配的私钥。
我们将使用keytool和openssl命令的组合从 PEM 转换为 JKS。keytool命令随 JDK(Java 开发工具包)一起提供,用于从 PEM 转换为 PKCS12 。第二个命令openssl需要下载 ,它的作用是从 PKCS12 转换为 JKS。
2. 文件格式
JKS 是 Java 特定的文件格式,在 Java 8 之前它是 KeyStores 的默认格式。从 Java 9 开始,PKCS#12 是默认的 KeyStore 格式。尽管有 JKS,但 PKCS#12 是一种用于存储加密数据的标准化且与语言无关的格式。PKCS#12 格式也称为 PKCS12 或 PFX。
**PEM(隐私增强邮件)也是一种证书容器格式。**PEM 文件以 Base64 编码。这确保了数据在不同系统之间的转换过程中保持不变。
此外,PEM 文件可以包含一个或多个实例,每个实例由纯文本页眉和页脚分隔:
-----BEGIN CERTIFICATE-----
// base64 encoded
-----END CERTIFICATE-----
3. 将 PEM 转换为 JKS 格式
我们现在将完成将所有证书和私钥从 PEM 格式转换为 JKS 格式的步骤。
出于示例的目的,我们将创建一个自签名证书。
3.1. 创建 PEM 文件
我们将首先使用openssl生成两个文件key.pem和cert.pem:
openssl req -newkey rsa:2048 -x509 -keyout key.pem -out cert.pem -days 365
该工具将提示我们输入 PEM 密码和其他信息。 回答完所有提示后,openssl工具会输出两个文件:
- key.pem(私钥)
- cert.pem(公共证书)
我们将使用这些文件来生成我们的自签名证书。
3.2. 生成 PKCS12 证书
在大多数情况下,证书采用公钥加密标准 #12 (PKCS12) 格式。不太常见的是,我们使用 Java KeyStore (JKS) 格式。
让我们将 PEM 转换为 PKCS12 格式:
openssl pkcs12 -export -in cert.pem -inkey key.pem -out certificate.p12 -name "certificate"
命令运行时,系统会提示我们输入之前为key.pem创建的密码:
Enter pass phrase for key.pem:
然后我们会看到提示要求输入certificate.p12的新密码:
Enter Export Password:
之后,我们将有一个以 PCKS12 格式存储的certificate.p12 KeyStore。
3.3. PKCS#12 到 JKS
最后一步是从 PKCS12 转换为 JKS 格式:
keytool -importkeystore -srckeystore certificate.p12 -srcstoretype pkcs12 -destkeystore cert.jks
当命令执行时,它会提示输入cert.jks文件的新密码:
Enter destination keystore password:
它会提示我们输入之前创建的certificate.p12密码:
Enter source keystore password:
然后,我们应该看到最终输出:
Entry for alias certificate successfully imported.
Import command completed: 1 entries successfully imported, 0 entries failed or cancelled
结果是以 JKS 格式存储的 cert.jks KeyStore。