我知道什么是证书链。在java中,当使用KeyStore对象时,我们可以向密钥库对象添加证书和私钥。
为此,我们这样做:
KeyStore sourceKeystore = KeyStore.getInstance("jks");
try (InputStream stream = new BufferedInputStream(Files.newInputStream(sourceKeystorePath))) {
sourceKeystore.load(stream, sourceKeystorePassword);
}
KeyStore destKeystore = KeyStore.getInstance("jks");
destKeystore.load(null, destKeystorePassword);
Enumeration<String> aliasList = sourceKeystore.aliases();
while (aliasList.hasMoreElements()) {
String alias = aliasList.nextElement();
destKeystore.setCertificateEntry(alias, sourceKeystore.getCertificate(alias));
if(sourceKeystore.isKeyEntry(alias)) {
System.out.println(alias + " : is private key");
Key key = sourceKeystore.getKey(alias, "secret".toCharArray());
Certificate[] chain = new Certificate[1];
chain[0] = sourceKeystore.getCertificate(alias);
destKeystore.setKeyEntry(alias, key, "secret".toCharArray(), chain);
}
}
try (OutputStream stream = new BufferedOutputStream(Files.newOutputStream(destKeystorePath))) {
destKeystore.store(stream, destKeystorePassword);
}
我想理解的是destKeystore.setKeyEntry()
。当我给出一个证书链作为参数时,我能给出一个这样的证书数组吗?
mainCert
第一个问题:这些设置链的不同方式意味着什么?
第二个问题:,如果我有一个JKS文件的话。如何找到证书链的确切值,以及在此KeyStore中为私钥设置证书链的顺序?基本上我的意思是,我想找出在JKS文件中传递给KeyStore.setKeyEntry()的Certificate[]参数是什么
发布于 2019-06-11 03:02:04
首先,证书链是如何形成的基础知识。
当您最初通过任何方式(keytool、openssl等)创建key pair
时,它基本上由一个与其self-signed certificate
关联的private key
组成,其中自签名证书包含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)
如果您查看证书的索引,它们会显示以下内容:
最重要的证书是第一个证书(又称用户/对等certificate)
在编码术语中,证书数组的第一个(第零个)元素是用户证书,证书数组的最后一个元素是CA证书。这意味着,可以在第一个证书中找到属于您的私钥的匹配公钥。
在99%的情况下,您不必自己处理证书链的顺序。当CA使用证书链进行响应时,它的顺序通常是正确的。您所要做的就是将证书链更新为您的私钥。
下面是你的问题的答案:
别名Certificate[] Certificate1=sourceKeystore.getCertificate(别名);destKeystore.setKeyEntry(别名,密钥,“Certificate1”.toCharArray(),chain);
还有一个方法可以返回与私钥getCertificateChain()关联的整个证书链。在这里你可以简单地做:
别名Certificate[]链=sourceKeystore.getCertificateChain(别名);destKeystore.setKeyEntry(别名,密钥,“
”.toCharArray(),链);
getCertificateChain()
返回数组的顺序是它最初设置的方式。
https://stackoverflow.com/questions/56523093
复制相似问题