Keystore.setKeyEntry()中的Certificate []链是什么意思,以及如何从JKS或PKCS12获取该信息?

时间:2019-06-10 08:42:35

标签: java security ssl keystore

我知道什么是证书链。在Java中,当使用KeyStore对象时,我们可以将证书和私钥添加到Keystore对象中。

为此,我们这样做:

destKeystore.setKeyEntry()

我想了解的是{{1}}。当我将证书链作为参数时,是否可以提供这样的证书数组?

  1. [rootCert,interCert,mainCert]
  2. [mainCert,interCert,rootCert]
  3. [mainCert]

第一个问题: 设置链条的这些不同方式意味着什么?

第二个问题: 此外,如果我有JKS文件。我如何找到证书链的确切值以及在此KeyStore中为私钥设置证书链的顺序?基本上,我的意思是我想确定传递给该JKS文件中KeyStore.setKeyEntry()的Certificate []参数是什么

1 个答案:

答案 0 :(得分:1)

首先,介绍证书链形成的基础。

最初通过任何方式(键盘工具,openssl等)创建key pair时,它基本上都由与其private key关联的self-signed certificate组成,其中,证书包含public key。然后从密钥对中创建一个PKCS#10certificate signing request),该密钥对基本上是有关私钥+公钥的所有者的一些身份信息,这些信息由私钥放在一起并签名。该CSR将发送到Certificate Authority以取回已签名的证书。 CA对其进行签名并以证书链进行响应。然后,此收到的证书链将更新为最初创建的私钥,以替换旧的自签名证书。现在,我们将此密钥对称为签名密钥对,它不再是自签名的。

现在了解CA发送的内容。基本上,CA发送的证书链如下所示:

CA Certificate (self-signed)
|
|__ 2. Sub CA Certificate (signed by the above CA)
        |
        |__ 1. Sub-sub CA Certificate (if any) (signed by the above Sub CA)
                |
                |__ 0. End Entity Certificate (your certificate, signed by the above cert)

如果您查看证书的索引,它们会告诉您以下内容:

  • 最重要的证书是第一个证书(又名用户/对等证书)
  • 最不重要的证书是最后一个证书(又称CA证书)

在编码术语中,证书阵列的第一个(第零个)元素是用户证书,而证书阵列的最后一个元素是CA证书。也就是说,可以在第一个证书中找到属于您的私钥的匹配公钥。

99%的时间您不必自己处理证书链的顺序。当CA用证书链进行响应时,通常顺序正确。您要做的就是将证书链更新为您的私钥。

现在回答您的问题:

  1. 由于您处在Java世界中,因此证书的第一顺序被认为是向后的(不正确)。第二个选项是正确的。第三个选项也是正确的,但是建议您始终包含整个证书链。
  2. 在您正在执行的代码中:
Certificate[] chain = new Certificate[1];
chain[0] = sourceKeystore.getCertificate(alias);
destKeystore.setKeyEntry(alias, key, "secret".toCharArray(), chain);

还有一种方法可以用来向您返回与私钥getCertificateChain()关联的整个证书链。您可以在哪里简单地做:

Certificate[] chain = sourceKeystore.getCertificateChain(alias);
destKeystore.setKeyEntry(alias, key, "secret".toCharArray(), chain);

getCertificateChain()返回数组的顺序是首先设置数组的方式。