ASN.1 语法和编码简介

证书注册 API 使用抽象语法表示法 One (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 使用 可辨别编码规则 (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 类型。
    0x13 PRINTABLE_STRING类型的标记号。

ASN.1 类型系统

证书请求编码

ASN.1 类型的 DER 编码

可辨别编码规则