Introducción a la sintaxis y la codificación de ASN.1

La API de inscripción de certificados usa notación de sintaxis abstracta uno (ASN.1) para definir, codificar y descodificar las solicitudes de certificado y los certificados que transfiere entre equipos cliente y entidades de certificación. ASN.1 se puede dividir conceptualmente en un conjunto de reglas de sintaxis y un conjunto de reglas de codificación, como se muestra en los ejemplos siguientes.

Ejemplo de sintaxis de ASN.1

Una solicitud de certificado contiene, entre otras cosas, el nombre de la entidad que realiza la solicitud o para la que se realiza la solicitud. El nombre es una secuencia de nombres distintivos relativos (RDN) X.500. Cada RDN de la secuencia consta de un identificador de objeto (OID) y un valor. La sintaxis ASN.1 de un nombre de sujeto se muestra en el ejemplo siguiente.

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

RelativeDistinguishedName ::= SET OF AttributeTypeValue

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

Ejemplo de codificación de ASN.1

La API de inscripción de certificados usa reglas de codificación distinguida (DER) para codificar el nombre del firmante anterior. DER requiere que cada elemento del nombre se represente mediante un triplete TLV donde T contiene el número de etiqueta del tipo ASN.1, L contiene la longitud y V contiene el valor asociado. En el ejemplo siguiente se muestra cómo se codifica el nombre del firmante 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"

Tenga en cuenta los siguientes puntos:

  • Línea 1:
    El nombre es una secuencia de nombres distintivos relativos.
    El número de etiqueta del tipo SEQUENCE es 0x30.
    El nombre del firmante de TestCN.TestOrg requiere 35 bytes (0x23).
  • Línea 2:
    Common Name, TestCN, es un único conjunto de estructuras AttributeTypeValue .
    El número de etiqueta de un SET es 0x31.
  • Línea 3:
    La estructura AttributeTypeValue es una secuencia.
    El número de etiqueta del tipo SEQUENCE es 0x30.
    La estructura requiere 13 (0xD) bytes.
  • Líneas de 4 a 6:
    El identificador de objeto (OID) del nombre común es 2.5.4.3.
    El OID es un tipo de OBJECT_ID de tres bytes.
    El número de etiqueta del tipo de OBJECT_ID es 0x06.
  • Líneas 7 a 9:
    El nombre común, TestCN, es un valor de cadena.
    La cadena es un tipo de PRINTABLE_STRING de seis bytes.
    El número de etiqueta del tipo de PRINTABLE_STRING es 0x13.

Sistema de tipos ASN.1

Codificación de solicitud de certificado

Codificación DER de tipos ASN.1

reglas de codificación distinguida