Что означает цепочка Certificate [] в Keystore.setKeyEntry () и как получить эту информацию из JKS или PKCS12? - PullRequest
1 голос
/ 10 июня 2019

Я знаю, что такое цепочка сертификатов.В 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. [mainCert]

Первый вопрос: Что означают эти различные способы настройки цепи?

Второй вопрос: Также, если у меня есть файл JKS.Как найти это точное значение цепочки сертификатов и в каком порядке цепочка сертификатов была установлена ​​для закрытого ключа в этом хранилище ключей?По сути, я имею в виду, что я хочу выяснить, какой параметр Certificate [] был передан KeyStore.setKeyEntry () в этом файле JKS

1 Ответ

1 голос
/ 10 июня 2019

Во-первых, основы формирования цепочки сертификатов.

Когда вы изначально создаете key pair любым способом (keytool, openssl и т. Д.), Он в основном состоит из private keyсвязанный с self-signed certificate, где самоподписанный сертификат содержит public key.И затем из пары ключей создается PKCS#10 ( запрос на подпись сертификата ), который в основном представляет собой некоторую идентификационную информацию о владельце частного ключа + открытый ключ, собранную и подписанную частнымключ.Этот CSR будет отправлен на Certificate Authority для получения подписанного сертификата обратно.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% времени, когда вам не нужно самостоятельно обрабатывать порядок цепочки сертификатов.Когда ЦС отвечает цепочкой сертификатов, она обычно находится в правильном порядке.Все, что вам нужно сделать, это обновить цепочку сертификатов до вашего личного ключа.

Теперь ответы на ваши вопросы:

  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() возвращает массив, соответствует тому, как он был установлен вначале.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...