Во-первых, основы формирования цепочки сертификатов.
Когда вы изначально создаете 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% времени, когда вам не нужно самостоятельно обрабатывать порядок цепочки сертификатов.Когда ЦС отвечает цепочкой сертификатов, она обычно находится в правильном порядке.Все, что вам нужно сделать, это обновить цепочку сертификатов до вашего личного ключа.
Теперь ответы на ваши вопросы:
- Поскольку вы находитесь в мире Java, первый заказсертификатов считается задом наперед (неверно).Второй вариант правильный.Третий вариант также верен, но желательно всегда включать всю цепочку сертификатов, если она у вас есть.
- В коде, где вы делаете:
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()
возвращает массив, соответствует тому, как он был установлен вначале.