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

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

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

我知道什么是证书链。在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()返回数组的顺序是它首先设置的方式。

热门问答

急急急!!核验图片验证码填写到接入备案企业侧备案系统中,在哪操作啊?

无聊至极互联网重度用户
推荐
你反馈的上海备案的APP核验验证码吗?如果是的话,提交订单的时候直接写验证码就可以的。 在补充材料的下面 image.png ... 展开详请

存储桶和项目概念?

Hyman.W

腾讯云 · 高级产品经理 (已认证)

推荐
一个存储桶对应多个项目的管理方式,可以使用 “标签” 来管理, 在创建存储桶或者修改存储桶配置的页面可以添加。 参考: 1,存储桶标签使用 https://cloud.tencent.com/document/product/436/34830 2,如果需要通过外部系统来管理...... 展开详请

智能钛能处理大数据文件吗?我有30G的数据存储在本地电脑硬盘上?

腾讯智能钛AI开发者

腾讯云 · 智能钛产品团队 (已认证)

腾讯智能钛产品团队官方运营账号。分享产品最新动态,第一时间解答用户疑问。
推荐

硬盘可以升级吗?

最爱开车啦互联网的敏感者
推荐

可以升级,小微活动中没有云硬盘的的,后续可以用同帐号在官网购买和服务器同地域同地区的云硬盘挂载到服务器上使用。

云硬盘挂载初始化方法 可参考 https://cloud.tencent.com/document/product/362/6735

云通信 70402 错误?

推荐已采纳

参数非法,请检查必填字段是否填充,或者字段的填充是否满足协议要求。

您好,可参考此文档:https://cloud.tencent.com/document/product/269/1671

录音识别sdk的录音文件如何保存?

Richel码农
推荐

1.实时语音sdk内置录音器采集音频暂不支持保存语音数据,如需要保存语音数据建议上层自行采集音频数据。

2.实时语音识别sdk不支持暂停&继续操作,停止识别后重新调用start即开始识别。

所属标签

扫码关注云+社区

领取腾讯云代金券