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

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (1)
  • 关注 (0)
  • 查看 (41)

我知道什么是证书链。在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()。当我将一个证书链作为参数提供给我时,我可以提供一系列这样的证书吗?

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

第一个问题: 这些设置链的各种方式是什么意思?

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

提问于
用户回答回答于

首先,介绍如何形成证书链的基础知识。

当你最初key pair通过任何方式创建一个(keytool,openssl等)时,它基本上由一个private key与其关联的self-signed certificate,其中自签名证书包含public key。然后从密钥对中创建PKCS#10证书签名请求),其基本上是关于私钥+公钥的所有者的一些身份信息,由私钥放在一起并签名。此CSR将被发送到a 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()返回数组的顺序是它首先设置的方式。

扫码关注云+社区

领取腾讯云代金券