2015-07-02 3 views
6

Есть три сертификата в моем примере, предположим, что они образуют цепочку, но я еще не знаю, какой из них подписан которых:Как узнать, какой 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 сертификата, который его подписал?

+0

Не могли бы вы сами выставить сертификаты для анализа? – frasertweedale

ответ

4

Если вы посмотрите на определение АСН.1 SKI и AKI в RFC5280 (после ссылки в вашем вопросе) разница становится очевидной:

SubjectKeyIdentifier ::= KeyIdentifier 

AuthorityKeyIdentifier ::= SEQUENCE { 
    keyIdentifier    [0] KeyIdentifier   OPTIONAL, 
    authorityCertIssuer  [1] GeneralNames   OPTIONAL, 
    authorityCertSerialNumber [2] CertificateSerialNumber OPTIONAL } 

KeyIdentifier ::= OCTET STRING 

Итак, AKI не является OCTET STRING , но SEQUENCE из трех необязательных элементов. Одним из этих элементов является строка октета, которую можно сравнить с SKI.

Distinguished Encoding Rules (DER) определяет представление байтов этих структур ASN.1. Отдельные байты расширения AKI имеют следующий смысл (см A Layman's Guide to a Subset of ASN.1, BER, and DER):

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 

04 OCTET STRING 
18 LENGTH 
30 SEQUENCE 
16 LENGTH 
80 CONTEXT-SPECIFIC PRIMITIVE TAG 0 
14 LENGTH 
.. DATA 

Первые два байта (04 18) являются частью структуры Extension (как описано в соответствующем вопросе Why doesn't my key identifier match?), фактический AKI контент расширения начинается с «30 16».

Ваш код Java для декодирования AKI должен выглядеть следующим образом (с использованием Bouncy Castle):

byte[] extensionValue = cert.getExtensionValue("2.5.29.35"); 
byte[] octets = DEROctetString.getInstance(extensionValue).getOctets(); 
AuthorityKeyIdentifier authorityKeyIdentifier = AuthorityKeyIdentifier.getInstance(octets); 
byte[] keyIdentifier = authorityKeyIdentifier.getKeyIdentifier(); 
String keyIdentifierHex = new String(Hex.encode(keyIdentifier)); 

И для декодирования СКИ:

extensionValue = cert.getExtensionValue("2.5.29.14"); 
octets = DEROctetString.getInstance(extensionValue).getOctets(); 
SubjectKeyIdentifier subjectKeyIdentifier = SubjectKeyIdentifier.getInstance(octets); 
keyIdentifier = subjectKeyIdentifier.getKeyIdentifier(); 
keyIdentifierHex = new String(Hex.encode(keyIdentifier)); 

Кроме того, оба расширения являются необязательными. Если ваш код должен работать с произвольными сертификатами, тогда необходим резервный механизм (например, проверка подписей).

+0

Благодарим вас за подробный ответ. товарищ по команде понял это вчера, это именно то объяснение, которое я получил. принято в качестве ответа. Я все еще новичок в использовании модулей шифрования/безопасности Java, и теперь это начинает иметь смысл. – CobraEnergyDrink

+0

Не только как резерв, вы всегда должны проверять child.Issuer равно parent.Subject; который работает на v1 без каких-либо расширений. AKI/SKI *, если присутствует *, должна быть дополнительной проверкой, и может помочь, когда один ЦС имеет более одного сертификата (хотя это часто несколько сертификатов для одного ключа, а не сертификаты для нескольких ключей). –

0

Если вы ищете действительно быструю проверку, просто откройте сертификат в окнах и найдите вкладку под названием «Путь сертификации». Он также позволяет легко проходить через цепочку сертификатов, если это применимо. (Я бы опубликовал фотографию, но, видимо, еще не получил достаточной репутации.)

+0

извините, но мне нужно что-то в коде. – CobraEnergyDrink

Смежные вопросы