首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Keystore.setKeyEntry()中的Certificate[]链是什么意思,以及如何从JKS或PKCS12获取该信息?

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

Stack Overflow用户
提问于 2019-06-10 16:42:36
回答 1查看 1.8K关注 0票数 1

我知道什么是证书链。在java中,当使用KeyStore对象时,我们可以向密钥库对象添加证书和私钥。

为此,我们这样做:

代码语言:javascript
运行
复制
        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

  • mainCert,rootCert,英特尔,
  1. rootCert,英特尔,英特尔,interCert,英特尔,英特尔,interCert,英特尔,rootCert
  2. mainCert

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

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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发送的证书链如下所示:

代码语言:javascript
运行
复制
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)

  • The最不重要的证书),最不重要的证书是最后一个证书(也称为CA certificate)

在编码术语中,证书数组的第一个(第零个)元素是用户证书,证书数组的最后一个元素是CA证书。这意味着,可以在第一个证书中找到属于您的私钥的匹配公钥。

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

下面是你的问题的答案:

  1. 由于您是在java世界中,证书的第一个顺序被认为是向后的(不正确)。第二种选择是正确的。第三个选项也是正确的,但建议始终包含整个证书链(如果有)。
  2. 在您正在执行的代码中:

别名Certificate[] Certificate1=sourceKeystore.getCertificate(别名);destKeystore.setKeyEntry(别名,密钥,“Certificate1”.toCharArray(),chain);

还有一个方法可以返回与私钥getCertificateChain()关联的整个证书链。在这里你可以简单地做:

别名Certificate[]链=sourceKeystore.getCertificateChain(别名);destKeystore.setKeyEntry(别名,密钥,“

”.toCharArray(),链);

getCertificateChain()返回数组的顺序是它最初设置的方式。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56523093

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档