Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ssl/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将具有多个证书的pem转换为java密钥库_Java_Ssl_Keytool - Fatal编程技术网

将具有多个证书的pem转换为java密钥库

将具有多个证书的pem转换为java密钥库,java,ssl,keytool,Java,Ssl,Keytool,我得到了一个pem文件,其中有两个证书 第一个是证书是针对我的公司的,即主题是针对我的公司的 第二个证书是颁发者的证书 看起来像这样 Bag Attributes localKeyID: 01 00 00 00 friendlyName: CCAPI Client Certificate Key Attributes X509v3 Key Usage: 10 -----BEGIN RSA PRIVATE KEY----- <<contents>>

我得到了一个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文件是正确的吗?如何描述私钥部分?这是我尝试连接到的服务器的公钥吗

其次,我需要使用keytool命令创建一个java密钥库文件jks,其中包含证书和颁发证书

有人能帮我做这件事的命令吗。我花了很多时间在谷歌上搜索,但似乎有很多不同的用例,这让我很困惑


提前感谢

严格来说,PEM是一个容器,可以保存各种类型的文本编码PKI数据以及文本信息

引自:

文本编码从一行开始,该行包括---BEGIN,a 标签,和---,并以一条线结束,该线包括---END,a 标签,和--。在这些行之间,还是封装 边界是根据本规范第4节规定的base64编码数据 [RFC4648]。PEM[RFC1421]将该数据称为封装的数据 文本部分。封装边界之前的数据是 允许,并且解析器在处理此类数据时不得出现故障 数据此外,解析器应该忽略空格和其他非空格- base64个字符,必须处理不同的换行规则

PEM文件中的私钥只是私钥。该密钥不需要与文件中的任何证书存在任何关系

查看它是否是证书公钥的私钥的唯一方法是比较相应的公钥。从私钥生成公钥,并与证书中的公钥进行比较

从私钥获取公钥 将私钥提取到一个单独的文件中,并放置行

-----BEGIN RSA PRIVATE KEY-----
<<contents>>
-----END RSA PRIVATE KEY-----
-----BEGIN CERTIFICATE-----
<<contents>>
-----END CERTIFICATE-----
从证书获取公钥 将证书放入行中的单独文件certfile.pem中

-----BEGIN RSA PRIVATE KEY-----
<<contents>>
-----END RSA PRIVATE KEY-----
-----BEGIN CERTIFICATE-----
<<contents>>
-----END CERTIFICATE-----
-noout禁止打印证书

然后检查pubkey.pem和pubkey2.pem

Java密钥存储


Oracle网站上有一个关于如何将PEM证书导入JKS的网站。你试过了吗?

你没有提到为什么给你这个文件,但从内容来看,我认为它是用来通过HTTPS客户端身份验证访问网站/服务的。私钥和证书用于针对服务器进行身份验证。可能需要颁发者证书来完成到服务器上受信任根证书的链,或者根本不需要它

该文件不是以非常常见的格式编码的,这基本上是OpenSSL将PKCS12文件作为PEM写入时发生的情况。以下OpenSSL命令将生成如下文件:

openssl pkcs12 -in keyStore.p12 -out keyStore.pem -nodes
这将保留来自PKCS12格式的元数据,如IDs和friendlyNames,因此您可以看到私钥和第一个证书属于同一类。但这有点奇怪,因为

私钥不再加密。 此格式仅适用于使用OpenSSL库的软件中的进一步处理,而不适用于Java或Microsoft IIS、.NET世界。二进制PKCS12文件在所有环境中都可用。 您可以使用以下OpenSSL命令将其转换回二进制PKCS12:

openssl pkcs12 -export -in keyStore.pem -out keyStore.p12

从现在起,您就有了一个标准PKCS12文件,您可以使用它,也可以使用它。

私钥部分是证书的私钥。@EJP,一般来说,不是。它只是私钥。当且仅当相应的公钥与证书中的公钥相同时,它才是证书的私钥。该格式对于使用OpenSSL库(如Apache httpd和nginx)的某些程序很有用,因为SSL_[CTX_ux]use*文件可以一步读取它们,而P12需要多个步骤才能解包,特别是当服务器必须在无人在场的情况下启动或重新启动时。但是对于Java,我完全同意。@dave_thompson_085谢谢你指出这一点,我已经编辑了答案。