2013-03-08 3 views
4

Я декодирую сертификат X.509 в формате ASN.1. Я успешно его расшифровываю, пересекая структуру, но есть одна вещь, которую я не понимаю.ASN.1 Octet Strings

Есть несколько сценариев, где я получаю строку октета, и этот сайт, на котором я играю (http://lapo.it/asn1js/), показывает, что эти строки октетов фактически содержат больше дерева ASN.1. Этот сайт аннотирует такие октетные строки с (инкапсуляциями)

Мой вопрос заключается в следующем: как узнать во время разбора, что строка октета фактически инкапсулирует что-то еще? Я просто пытаюсь разобрать его, глядя, получаю ли я тег и допустимую длину? Если нет, то это чистые байтовые данные? И если да, то это действительное поддерево?

Или это означает, что он выводится в виде байтов, и потребитель должен тогда попытаться проанализировать его, если он знает, что он закодирован для определенных ключей?

Возьмите пример, который уже загружен на сайт и нажмите «декодировать». Я имею в виду, например, смещение 332, которое является октетной строкой, которая инкапсулирует битовую строку.

+0

Offset 332 в этом примере является * keyUsage *, что [только битовая] (HTTP://www.alvestrand.no/objectid/2.5.29.15.html). Более интересным примером может быть 'subjectAltName' 2.5.29.17, не присутствующий в этом сертификате, но https://google.com/ имеет хороший способ проверки синтаксического анализа. –

+0

Извините, просто чтобы быть ясным, я имею в виду сертификат на сайте google.com https, у него есть 40 + altNames. Это * not * a LMGTFY ;-) –

+0

@ mr.spuratic Offset 332 в этом примере имеет строку октета, которая содержит битовую строку. Мой вопрос в том, есть ли какое-то правило, как я могу вычесть, что примитив инкапсулирует что-то еще. Или я просто попытаюсь его декодировать, и если длины и тип все работают, то вместо этого возьмите декодированные значения? Или я знаю из какой-то спецификации, что такие предметы, как subjectAltName, всегда являются октетной строкой, которая кодирует что-то еще? – Cocoanetics

ответ

7

Это то, что «расширения» выглядит в ASN.1. (RFC 2459 §B.2 - Я знаю, что RFC «устарел», но это полезное приложение отсутствует в более поздних версиях).

Extensions ::= SEQUENCE OF Extension 

Extension ::= SEQUENCE { 
extnId  OBJECT IDENTIFIER, 
critical BOOLEAN DEFAULT FALSE, 
extnValue OCTET STRING } 

Каждая служебная нагрузка расширения инкапсулируется в пределах OCTET STRING. OID расширений говорит вам, чего ожидать в этой строке октета. В случае keyUsage это BIT STRING (§4.2.1.3).

И теперь у меня есть ответ о моем собственном вопросе на subjectAltName, это в §4.2.1.7.

Одним из преимуществ использования OCTET STRING для контента является то, что по спецификации специфицированные неизвестные (некритические) расширения могут быть идентифицированы как таковые и тривиально пропущены (хотя я думаю, что DER также делает его тривиальным).

+1

Лучшее объяснение Я получил вопрос ASN1 в течение длительного времени. ;-) – Cocoanetics

1

И способ сказать средства ASN.1 для борьбы с этим инкапсуляцией - это использовать ключевое слово «СОДЕРЖАНИЕ». Например (это не фактический/правильный сертификат спецификации, но это должно дать вам идею):

TstCert DEFINITIONS IMPLICIT TAGS ::= 
BEGIN 
    Sun ::= SEQUENCE { 
     subjAltType OBJECT IDENTIFIER, 
     name GenNames 
    } 

    GenNames ::= SEQUENCE SIZE (1..5) OF GenName 

    GenName ::= CHOICE { 
     otherName [0] OtherName, 
     rfc822Name [1] UTF8String 
    } 

    OtherName ::= OCTET STRING (CONTAINING SEQUENCE { 
     type-id OBJECT IDENTIFIER, 
     value [0] EXPLICIT UTF8String 
    }) 
END 
Смежные вопросы