Поделиться через


Общие сведения о синтаксисе и кодировке ASN.1

API регистрации сертификатов использует абстрактную нотацию синтаксиса (ASN.1) для определения, кодирования и декодирования запросов сертификатов и сертификатов, которые он передает между клиентскими компьютерами и центрами сертификации. ASN.1 можно концептуально разделить на набор правил синтаксиса и набор правил кодирования, как показано в следующих примерах.

Пример синтаксиса ASN.1

Запрос сертификата содержит, помимо прочего, имя сущности, выполняющей запрос или для которой выполняется запрос. Имя — это последовательность относительных различаемых имен X.500 (RDNs). Каждая RDN в последовательности состоит из идентификатора объекта (OID) и значения. Синтаксис ASN.1 для имени субъекта показан в следующем примере.

---------------------------------------------------------------------
-- Subject name
---------------------------------------------------------------------
Name ::= SEQUENCE OF RelativeDistinguishedName

RelativeDistinguishedName ::= SET OF AttributeTypeValue

AttributeTypeValue ::= SEQUENCE 
{
   type               OBJECT IDENTIFIER,
   value              ANY 
}

Пример кодирования ASN.1

API регистрации сертификатов использует различающиеся правила кодирования (DER) для кодирования предыдущего имени субъекта. Для DER требуется, чтобы каждый элемент имени был представлен триплетом TLV, где T содержит номер тега типа ASN.1, L содержит длину, а V — соответствующее значение. В следующем примере показано, как закодировано имя субъекта TestCN.TestOrg.

1.     30 23            ; SEQUENCE (0x23 = 35 Bytes)
2.     |  |  31 0f            ; SET (f Bytes)
3.     |  |  |  30 0d            ; SEQUENCE (d Bytes)
4.     |  |  |     06 03         ; OBJECT_ID (3 Bytes)
5.     |  |  |     |  55 04 03
6.     |  |  |     |     ; 2.5.4.3 Common Name (CN)
7.     |  |  |     13 06         ; PRINTABLE_STRING (6 Bytes)
8.     |  |  |        54 65 73 74 43 4e                    ; TestCN
9.     |  |  |           ; "TestCN"
10.    |  |  31 10            ; SET (10 Bytes)
11.    |  |     30 0e            ; SEQUENCE (e Bytes)
12.    |  |        06 03         ; OBJECT_ID (3 Bytes)
13.    |  |        |  55 04 0a
14.    |  |        |     ; 2.5.4.10 Organization (O)
15.    |  |        13 07         ; PRINTABLE_STRING (7 Bytes)
16.    |  |           54 65 73 74 4f 72 67                 ; TestOrg
17.    |  |              ; "TestOrg"

Обратите внимание на следующие моменты:

  • Строка 1.
    Имя — это последовательность относительных различающихся имен.
    Номер тега для SEQUENCE имеет значение 0x30.
    Имя субъекта TestCN.TestOrg требует 35 (0x23) байтов.
  • Строка 2.
    Общее имя, TestCN, представляет собой единственный набор структур AttributeTypeValue.
    Номер тега для SET 0x31.
  • Строка 3.
    Структура AttributeTypeValue представляет собой последовательность.
    Номер тега для типа SEQUENCE имеет значение 0x30.
    Для структуры требуется 13 (0xD) байтов.
  • Строки 4–6:
    Идентификатор объекта (OID) для общего имени — 2.5.4.3.
    OID — это три байта OBJECT_ID типа.
    Номер тега для типа OBJECT_ID — 0x06.
  • Строки 7–9:
    Общее имя, TestCN, является строковым значением.
    Строка представляет собой шестибайтовый PRINTABLE_STRING тип.
    Номер тега для типа PRINTABLE_STRING — 0x13.

Система типов ASN.1

кодирование запроса на сертификат

кодировка DER типов ASN.1

различающиеся правила кодирования