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

时间:2017-12-12 13:15:09

标签: 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>>
-----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文件是正确的吗?如何描述PRIVATE KEY部分?这是我尝试连接的服务器的公钥吗?

其次,我需要使用keytool命令创建一个包含证书和问题证书的java密钥库文件(jks)。

有人可以帮助我完成这些命令。我花了很多时间在谷歌上搜索,但似乎有很多不同的使用案例让我感到困惑。

提前致谢

2 个答案:

答案 0 :(得分:1)

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

此文件不是以非常常见的格式编码,它基本上是在OpenSSL将PKCS#12文件写为PEM时发生的情况。以下OpenSSL命令将生成如下文件:

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

这保留了PKCS#12格式的元数据,如ID和friendlyNames,因此您可以看到私钥和第一个证书属于一起。但这有点奇怪,因为......

  1. 私钥未加密(不再)。
  2. 此格式仅适用于使用OpenSSL库的软件中的进一步处理,但不适用于Java或Microsoft(IIS,.NET)世界。二进制PKCS#12文件可以在所有环境中使用。
  3. 您可以使用以下OpenSSL命令将其转换回二进制PKCS#12:

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

    从现在开始,您有一个标准的PKCS#12文件,您可以使用directly in Java softwareconvert with keytool to JKS/JCEKS

答案 1 :(得分:0)

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

引自specification

  

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

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

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

  1. 从私钥获取公钥
  2. 将私钥解压缩到单独的文件(放行

    -----BEGIN RSA PRIVATE KEY-----
    <<contents>>
    -----END RSA PRIVATE KEY-----
    

    进入单独的privkey.pem文件)

    在命令行中:

    openssl rsa -in privkey.pem -pubout > pubkey.pub
    
    1. 从证书中获取公钥
    2. 将证书放入单独的文件certfile.pem(行

      -----BEGIN CERTIFICATE-----
      <<contents>>
      -----END CERTIFICATE-----
      

      再次调用openssl

      openssl x509 -pubkey -noout -in certfile.pem > pubkey2.pem
      

      -noout禁止打印证书

      然后检查pubkey.pempubkey2.pem

      Java密钥库

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