Compartilhar via


Introdução à sintaxe e codificação do ASN.1

A API de Registro de Certificado usa a Notação de Sintaxe Abstrata Um (ASN.1) para definir, codificar e decodificar as solicitações de certificado e certificados que transfere entre computadores cliente e autoridades de certificação. O ASN.1 pode ser dividido conceitualmente em um conjunto de regras de sintaxe e um conjunto de regras de codificação, conforme mostrado pelos exemplos a seguir.

Exemplo de sintaxe ASN.1

Uma solicitação de certificado contém, entre outras coisas, o nome da entidade que está fazendo a solicitação ou para a qual a solicitação está sendo feita. O nome é uma sequência de RDNs (nomes distintos relativos) X.500. Cada RDN na sequência consiste em um OID (identificador de objeto) e um valor. A sintaxe ASN.1 para um nome de assunto é mostrada no exemplo a seguir.

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

RelativeDistinguishedName ::= SET OF AttributeTypeValue

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

Exemplo de codificação ASN.1

A API de Registro de Certificado usa Distinguished Encoding Rules (DER) para codificar o nome da entidade anterior. O DER exige que cada item no nome seja representado por um trigêmeo TLV em que T contém o número de marca do tipo ASN.1, L contém o comprimento e V contém o valor associado. O exemplo a seguir mostra como o nome da entidade TestCN.TestOrg é codificado.

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"

Observe os seguintes pontos:

  • Linha 1:
    O nome é uma sequência de nomes distintos relativos.
    O número da marca para o tipo SEQUENCE é 0x30.
    O nome da entidade de TestCN.TestOrg requer 35 bytes (0x23).
  • Linha 2:
    O Nome Comum, TestCN, é um único conjunto de estruturas AttributeTypeValue .
    O número da marca de um SET é 0x31.
  • Linha 3:
    A estrutura AttributeTypeValue é uma sequência.
    O número da marca para o tipo SEQUENCE é 0x30.
    A estrutura requer 13 bytes (0xD).
  • Linhas de 4 a 6:
    O OID (identificador de objeto) para o Nome Comum é 2.5.4.3.
    O OID é um tipo de OBJECT_ID de três bytes.
    O número da marca do tipo OBJECT_ID é 0x06.
  • Linhas 7 a 9:
    O Nome Comum, TestCN, é um valor de cadeia de caracteres.
    A cadeia de caracteres é um tipo de PRINTABLE_STRING de seis bytes.
    O número da marca do tipo PRINTABLE_STRING é 0x13.

Sistema de tipos ASN.1

Codificação de solicitação de certificado

Codificação DER de tipos ASN.1

Distinguished Encoding Rules