Есть три сертификата в моем примере, предположим, что они образуют цепочку, но я еще не знаю, какой из них подписан которых:Как узнать, какой X509 сертификат, подписанный другой сертификат (Java)
X509Certificate c1 = ....
X509Certificate c2 = ....
X509Certificate c2 = ....
Я бы как узнать, какой сертификат несет ответственность за подписание другого сертификата.
План должен был получить «AuthorityKeyIdentifier» и соответствовать ему с «SubjectKeyIdentifier».
import org.bouncycastle.asn1. DEROctetString;
private static String decodeKey(byte[] e) {
DEROctetString octet = new DEROctetString(e);
return octet.toString();
}
String subjectKeyId = decodeKey(c.getExtensionValue("2.5.29.14"));
String authorityKeyId = decodeKey(c.getExtensionValue("2.5.29.35"));
Im получая следующее для сертификатов (в порядке цепи): субъект/орган ключа ID пару
Значение SubjectKeyIdentifier и AuthorityKeyIdentifier после декодирования:
Сертификат 1: (конец цепи)
#0416041482b7384a93aa9b10ef80bbd954e2f10ffb809cde
#04183016801482b7384a93aa9b10ef80bbd954e2f10ffb809cde
Сертификат 2: Подписанный Сертификат 1
#04160414ab8059c365836d1d7d13bd19c3ec1a8f0d476aa3
#04183016801482b7384a93aa9b10ef80bbd954e2f10ffb809cde
Свидетельство 3: Подписанный Сертификат 2
(no SubjectKeyIdentifier - null bytes)
#041830168014ab8059c365836d1d7d13bd19c3ec1a8f0d476aa3
отформатированный и выравниванием для легкого чтения (то же самое, один на вершине)
------------------------------------------------------------------------------
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
------------------------------------------------------------------------------
Certificate 1
#04 16 04 14 82 b7 38 4a 93 aa 9b 10 ef 80 bb d9 54 e2 f1 0f fb 80 9c de
#04 18 30 16 80 14 82 b7 38 4a 93 aa 9b 10 ef 80 bb d9 54 e2 f1 0f fb 80 9c de
Certificate 2
#04 16 04 14 ab 80 59 c3 65 83 6d 1d 7d 13 bd 19 c3 ec 1a 8f 0d 47 6a a3
#04 18 30 16 80 14 82 b7 38 4a 93 aa 9b 10 ef 80 bb d9 54 e2 f1 0f fb 80 9c de
Certificate 3
=== == == == == == == == == == == NO DATA == == == == == == == == == == == ==
#04 18 30 16 80 14 ab 80 59 c3 65 83 6d 1d 7d 13 bd 19 c3 ec 1a 8f 0d 47 6a a3
Я ожидал AuthorityKeyIdentifier С3 быть эквивалентно c2 SubjectKeyIdentifier. это, кажется, не так.
EDIT: некоторые части результата, похоже, совпадают, у меня есть идея в «SubjectKeyIdentifier» - он всегда начинается с «# 04», за которым следует длина содержимого (в шестнадцатеричном формате). Теперь у меня есть определенная идея о том, как декодировать «SubjectKeyIdentifier», но «AuthorityKeyIdentifier» по-прежнему остается большой загадкой для меня.
отношение SO post
ли я сделать что-то неправильно с декодированием? Почему AuthorKeyIdentifier не соответствует правильному объекту SubjectKeyIdentifier сертификата, который его подписал?
Не могли бы вы сами выставить сертификаты для анализа? – frasertweedale