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


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

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

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

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

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

RelativeDistinguishedName ::= SET OF AttributeTypeValue

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

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

API регистрации сертификатов использует Distinguished Encoding Rules (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

Distinguished Encoding Rules