将具有多个证书的 pem 转换为 java 密钥库
Converting pem with multiple certificates to java keystore
我得到了一个 pem 文件,其中有两个证书。
首先是证书是我公司特有的(即主题是我公司特有的)。
第二个证书是颁发者的证书。
看起来像这样...
Bag Attributes
localKeyID: 01 00 00 00
friendlyName: CCAPI Client Certificate
Key Attributes
X509v3 Key Usage: 10
-----BEGIN RSA PRIVATE KEY-----
<<contents>>
-----END RSA PRIVATE KEY-----
Bag Attributes
localKeyID: 01 00 00 00
friendlyName: CCAPI Client Certificate
subject=MyCompany CN/OU/O/L/ST/C
issuer=Issuer CN/OU/O/L/ST/C
-----BEGIN CERTIFICATE-----
<<contents>>
-----END CERTIFICATE-----
Bag Attributes
localKeyID: 02 00 00 00
subject=Issuer CN/OU/O/L/ST/C
issuer=Issuer CN/OU/O/L/ST/C
-----BEGIN CERTIFICATE-----
<<contents>>
-----END CERTIFICATE-----
首先我想确认几件事。
就术语而言,我有一个包含两个证书的 pem 文件是否正确?我如何描述私钥部分?这是我要连接的服务器的 public 密钥吗?
其次,我需要使用 keytool 命令创建一个 java 密钥库文件 (jks),其中包含证书和颁发的证书。
有人可以帮助我执行此操作的命令吗?我花了很多时间在谷歌上搜索,但似乎有很多不同的用例让我感到困惑。
提前致谢
严格来说,PEM是一个容器,可以保存各种类型的文本编码的PKI数据以及信息文本。
Textual encoding begins with a line comprising "-----BEGIN ", a
label, and "-----", and ends with a line comprising "-----END ", a
label, and "-----". Between these lines, or "encapsulation
boundaries", are base64-encoded data according to Section 4 of
[RFC4648]. (PEM [RFC1421] referred to this data as the "encapsulated
text portion".) Data before the encapsulation boundaries are
permitted, and parsers MUST NOT malfunction when processing such
data. Furthermore, parsers SHOULD ignore whitespace and other non-
base64 characters and MUST handle different newline conventions.
您的 PEM 文件中的私钥只是一个私钥。该密钥不需要与文件中的任何证书有任何关系。
判断它是否是证书public密钥的私钥的唯一方法是比较对应的public密钥。从私钥生成一个 public 密钥,并与证书中的 public 密钥进行比较。
- 从私钥中获取public密钥
将私钥提取到单独的文件中(将行
-----BEGIN RSA PRIVATE KEY-----
<<contents>>
-----END RSA PRIVATE KEY-----
到单独的 privkey.pem
文件)
在命令行中:
openssl rsa -in privkey.pem -pubout > pubkey.pub
- 从证书中获取 public 密钥
将证书放入单独的文件中certfile.pem
(行
-----BEGIN CERTIFICATE-----
<<contents>>
-----END CERTIFICATE-----
)
再次调用openssl
:
openssl x509 -pubkey -noout -in certfile.pem > pubkey2.pem
-noout
禁止打印证书
然后检查pubkey.pem
和pubkey2.pem
。
Java 密钥库
Oracle 站点上有一个关于如何将 PEM 证书导入 JKS 的 article。你试过了吗?
你没有提到为什么给你这个文件,但从内容来看我认为它是为了通过 HTTPS 客户端身份验证访问 Web site/service。私钥(和证书)用于对服务器进行身份验证。可能需要颁发者证书来完成到服务器上受信任根证书的链(或者可能根本不需要)。
此文件未以非常常见的格式编码,这基本上是 OpenSSL 将 PKCS#12 文件写入 PEM 时发生的情况。以下 OpenSSL 命令将生成如下文件:
openssl pkcs12 -in keyStore.p12 -out keyStore.pem -nodes
这会保留 PKCS#12 格式的元数据,例如 ID 和友好名称,因此您可以看到私钥和第一个证书属于同一类。但是有点奇怪,因为...
- 私钥未加密(不再)。
- 此格式仅对使用 OpenSSL 库的软件进行进一步处理有用,但对 Java 或 Microsoft(IIS、.NET)世界无效。二进制 PKCS#12 文件可以在所有环境中使用。
您可以使用以下 OpenSSL 命令将其转换回二进制 PKCS#12:
openssl pkcs12 -export -in keyStore.pem -out keyStore.p12
从现在开始,您将拥有一个可以使用的标准 PKCS#12 文件 directly in Java software or that you can convert with keytool to JKS/JCEKS。
我得到了一个 pem 文件,其中有两个证书。
首先是证书是我公司特有的(即主题是我公司特有的)。
第二个证书是颁发者的证书。
看起来像这样...
Bag Attributes
localKeyID: 01 00 00 00
friendlyName: CCAPI Client Certificate
Key Attributes
X509v3 Key Usage: 10
-----BEGIN RSA PRIVATE KEY-----
<<contents>>
-----END RSA PRIVATE KEY-----
Bag Attributes
localKeyID: 01 00 00 00
friendlyName: CCAPI Client Certificate
subject=MyCompany CN/OU/O/L/ST/C
issuer=Issuer CN/OU/O/L/ST/C
-----BEGIN CERTIFICATE-----
<<contents>>
-----END CERTIFICATE-----
Bag Attributes
localKeyID: 02 00 00 00
subject=Issuer CN/OU/O/L/ST/C
issuer=Issuer CN/OU/O/L/ST/C
-----BEGIN CERTIFICATE-----
<<contents>>
-----END CERTIFICATE-----
首先我想确认几件事。
就术语而言,我有一个包含两个证书的 pem 文件是否正确?我如何描述私钥部分?这是我要连接的服务器的 public 密钥吗?
其次,我需要使用 keytool 命令创建一个 java 密钥库文件 (jks),其中包含证书和颁发的证书。
有人可以帮助我执行此操作的命令吗?我花了很多时间在谷歌上搜索,但似乎有很多不同的用例让我感到困惑。
提前致谢
严格来说,PEM是一个容器,可以保存各种类型的文本编码的PKI数据以及信息文本。
Textual encoding begins with a line comprising "-----BEGIN ", a label, and "-----", and ends with a line comprising "-----END ", a label, and "-----". Between these lines, or "encapsulation boundaries", are base64-encoded data according to Section 4 of [RFC4648]. (PEM [RFC1421] referred to this data as the "encapsulated text portion".) Data before the encapsulation boundaries are permitted, and parsers MUST NOT malfunction when processing such data. Furthermore, parsers SHOULD ignore whitespace and other non- base64 characters and MUST handle different newline conventions.
您的 PEM 文件中的私钥只是一个私钥。该密钥不需要与文件中的任何证书有任何关系。
判断它是否是证书public密钥的私钥的唯一方法是比较对应的public密钥。从私钥生成一个 public 密钥,并与证书中的 public 密钥进行比较。
- 从私钥中获取public密钥
将私钥提取到单独的文件中(将行
-----BEGIN RSA PRIVATE KEY-----
<<contents>>
-----END RSA PRIVATE KEY-----
到单独的 privkey.pem
文件)
在命令行中:
openssl rsa -in privkey.pem -pubout > pubkey.pub
- 从证书中获取 public 密钥
将证书放入单独的文件中certfile.pem
(行
-----BEGIN CERTIFICATE-----
<<contents>>
-----END CERTIFICATE-----
)
再次调用openssl
:
openssl x509 -pubkey -noout -in certfile.pem > pubkey2.pem
-noout
禁止打印证书
然后检查pubkey.pem
和pubkey2.pem
。
Java 密钥库
Oracle 站点上有一个关于如何将 PEM 证书导入 JKS 的 article。你试过了吗?
你没有提到为什么给你这个文件,但从内容来看我认为它是为了通过 HTTPS 客户端身份验证访问 Web site/service。私钥(和证书)用于对服务器进行身份验证。可能需要颁发者证书来完成到服务器上受信任根证书的链(或者可能根本不需要)。
此文件未以非常常见的格式编码,这基本上是 OpenSSL 将 PKCS#12 文件写入 PEM 时发生的情况。以下 OpenSSL 命令将生成如下文件:
openssl pkcs12 -in keyStore.p12 -out keyStore.pem -nodes
这会保留 PKCS#12 格式的元数据,例如 ID 和友好名称,因此您可以看到私钥和第一个证书属于同一类。但是有点奇怪,因为...
- 私钥未加密(不再)。
- 此格式仅对使用 OpenSSL 库的软件进行进一步处理有用,但对 Java 或 Microsoft(IIS、.NET)世界无效。二进制 PKCS#12 文件可以在所有环境中使用。
您可以使用以下 OpenSSL 命令将其转换回二进制 PKCS#12:
openssl pkcs12 -export -in keyStore.pem -out keyStore.p12
从现在开始,您将拥有一个可以使用的标准 PKCS#12 文件 directly in Java software or that you can convert with keytool to JKS/JCEKS。