Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/security/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Keystore.setKeyEntry()中的证书[]链是什么意思?如何从JKS或PKCS12获取该信息?_Java_Security_Ssl_Keystore - Fatal编程技术网

Java Keystore.setKeyEntry()中的证书[]链是什么意思?如何从JKS或PKCS12获取该信息?

Java Keystore.setKeyEntry()中的证书[]链是什么意思?如何从JKS或PKCS12获取该信息?,java,security,ssl,keystore,Java,Security,Ssl,Keystore,我知道什么是证书链。在java中,当使用密钥库对象时,我们可以向密钥库对象添加证书和私钥 为此,我们: KeyStore sourceKeystore = KeyStore.getInstance("jks"); try (InputStream stream = new BufferedInputStream(Files.newInputStream(sourceKeystorePath))) { sourceKeystore.load(

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

为此,我们:

        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);
        }
keystoresourcekeystore=KeyStore.getInstance(“jks”);
try(InputStream=new BufferedInputStream(Files.newInputStream(sourceKeystorePath))){
加载(流,sourceKeystorePassword);
}
KeyStore destKeystore=KeyStore.getInstance(“jks”);
load(null,destKeystorePassword);
枚举别名列表=sourceKeystore.alias();
while(aliasList.hasMoreElements()){
String alias=aliasList.nextElement();
destKeystore.setCertificateEntry(别名,sourceKeystore.getCertificate(别名));
if(sourceKeystore.isKeyEntry(别名)){
System.out.println(别名+“:是私钥”);
Key=sourceKeystore.getKey(别名“secret.tocharray());
证书[]链=新证书[1];
链[0]=sourceKeystore.getCertificate(别名);
setKeyEntry(别名,密钥,“secret”.toCharArray(),链);
}
}
try(OutputStream=new BufferedOutputStream(Files.newOutputStream(destKeystorePath))){
destKeystore.store(流,destKeystorePassword);
}
我想了解的是
destKeystore.setKeyEntry()
。当我给出一个证书链作为参数时,我能给出一个像这样的证书数组吗

  • [rootCert、interCert、mainCert]
  • [mainCert、interCert、rootCert]
  • [主证书]
  • 第一个问题:这些设置链的不同方式意味着什么?


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

    当您最初通过任何方式(keytool、openssl等)创建
    密钥对
    时,它基本上由与其
    自签名证书相关联的
    私钥
    组成,其中自签名证书包含
    公钥
    。然后从密钥对中创建一个
    PKCS#10
    (),它基本上是关于私钥+公钥所有者的一些身份信息,放在一起并由私钥签名。此CSR将被发送到
    证书颁发机构
    ,以获取签名证书。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用证书链响应时,它通常是按照正确的顺序进行的。您所要做的就是将证书链更新为您的私钥

    现在回答您的问题:

  • 因为您身处java世界,所以第一顺序的证书被认为是向后的(不正确的)。第二种选择是正确的。第三个选项也是正确的,但如果您有完整的证书链,则建议始终包含整个证书链
  • 在您正在执行的代码中:
  • 还有一种方法可用于返回与私钥关联的整个证书链。您可以执行以下简单操作:


    getCertificateChain()
    返回数组的顺序与它最初设置的顺序相同。

    @always\u a\u rookie\u to\u learn。感谢您的详细回答。只有一件事,选项2和选项3之间没有区别吗?这样做可能产生什么后果。PS:你能给我一些资源的链接吗?如果你有,我可以深入理解所有这些。仅仅从链中添加对等证书是不常见的,如果你有整个证书链,我强烈建议添加整个证书链。Java文档是您最好的朋友。@always\u a\u新手\u to\u学习:有没有可能没有密码就拥有私钥。?在上述情况下为“secret”.toCharArray()。如果可能的话,我们将如何在这种情况下检索私钥。
    Certificate[] chain = new Certificate[1];
    chain[0] = sourceKeystore.getCertificate(alias);
    destKeystore.setKeyEntry(alias, key, "secret".toCharArray(), chain);
    
    Certificate[] chain = sourceKeystore.getCertificateChain(alias);
    destKeystore.setKeyEntry(alias, key, "secret".toCharArray(), chain);