我知道什么是证书链。在Java中,当使用KeyStore对象时,我们可以将证书和私钥添加到Keystore对象中。
为此,我们这样做:
destKeystore.setKeyEntry()
我想了解的是{{1}}。当我将证书链作为参数时,是否可以提供这样的证书数组?
第一个问题: 设置链条的这些不同方式意味着什么?
第二个问题: 此外,如果我有JKS文件。我如何找到证书链的确切值以及在此KeyStore中为私钥设置证书链的顺序?基本上,我的意思是我想确定传递给该JKS文件中KeyStore.setKeyEntry()的Certificate []参数是什么
答案 0 :(得分:1)
首先,介绍证书链形成的基础。
最初通过任何方式(键盘工具,openssl等)创建key pair
时,它基本上都由与其private key
关联的self-signed certificate
组成,其中,证书包含public key
。然后从密钥对中创建一个PKCS#10
(certificate 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证书。也就是说,可以在第一个证书中找到属于您的私钥的匹配公钥。
99%的时间您不必自己处理证书链的顺序。当CA用证书链进行响应时,通常顺序正确。您要做的就是将证书链更新为您的私钥。
现在回答您的问题:
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()
返回数组的顺序是首先设置数组的方式。