Présentation de la syntaxe et de l’encodage ASN.1

L’API d’inscription de certificat utilise la notation syntaxique abstraite 1 (ASN.1) pour définir, encoder et décoder les demandes de certificat et les certificats qu’elle transfère entre les ordinateurs clients et les autorités de certification. ASN.1 peut être divisé conceptuellement en un ensemble de règles de syntaxe et un ensemble de règles d’encodage, comme le montrent les exemples suivants.

Exemple de syntaxe ASN.1

Une demande de certificat contient, entre autres, le nom de l’entité qui effectue la demande ou pour laquelle la demande est effectuée. Le nom est une séquence de noms uniques relatifs (RDN) X.500. Chaque RDN de la séquence se compose d’un identificateur d’objet (OID) et d’une valeur. La syntaxe ASN.1 d’un nom d’objet est illustrée dans l’exemple suivant.

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

RelativeDistinguishedName ::= SET OF AttributeTypeValue

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

Exemple d’encodage ASN.1

L’API d’inscription de certificat utilise Distinguished Encoding Rules (DER) pour encoder le nom de l’objet précédent. DER nécessite que chaque élément dans le nom soit représenté par un triplet TLV où T contient le numéro de balise du type ASN.1, L contient la longueur et V contient la valeur associée. L’exemple suivant montre comment le nom d’objet TestCN.TestOrg est encodé.

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"

Notez les points suivants :

  • Ligne 1 :
    Le nom est une séquence de noms uniques relatifs.
    Le numéro d’étiquette du type SEQUENCE est 0x30.
    Le nom d’objet de TestCN.TestOrg nécessite 35 (0x23) octets.
  • Ligne 2 :
    Le nom commun, TestCN, est un ensemble unique de structures AttributeTypeValue .
    Le numéro d’étiquette d’un SET est 0x31.
  • Ligne 3 :
    La structure AttributeTypeValue est une séquence.
    Le numéro d’étiquette du type SEQUENCE est 0x30.
    La structure nécessite 13 octets (0xD).
  • Lignes 4 à 6 :
    L’identificateur d’objet (OID) pour le nom commun est 2.5.4.3.
    L’OID est un type OBJECT_ID de trois octets.
    Le numéro d’étiquette du type OBJECT_ID est 0x06.
  • Lignes 7 à 9 :
    Le nom commun, TestCN, est une valeur de chaîne.
    La chaîne est un type PRINTABLE_STRING de six octets.
    Le numéro d’étiquette du type PRINTABLE_STRING est 0x13.

Système de type ASN.1

Encodage de demande de certificat

Encodage DER des types ASN.1

Distinguished Encoding Rules