构造类型

构造的 抽象语法表示法 1 (ASN.1) 类型由基本类型、字符串类型或其他构造类型组成。 例如,X.509 证书扩展由三种基本 ASN.1 类型组成,如以下示例所示。

Extension ::= SEQUENCE 
{
   extnId              OBJECT IDENTIFIER,
   critical            BOOLEAN DEFAULT FALSE,
   extnValue           OCTET STRING
}

扩展由对象 标识符 (OID) 、用于标识扩展是否关键的布尔值以及包含值的字节数组组成。 证书注册 API 支持以下构造的 ASN.1 类型。

SEQUENCE 和 SEQUENCE OF

编码标记:0x30

包含一个或多个类型的有序字段系列。 字段可以标记为OPTIONALDEFAULT。 此外,为了避免解码时出现歧义,连续的可选字段应通过使用唯一标识符 (括号整数(如 [1]) )和以下必填字段(如以下示例所示)彼此不同。

SomeValue ::= SEQUENCE 
{
   a     INTEGER,
   b     [0] INTEGER OPTIONAL,
   c     [1] INTEGER DEFAULT 1,
   d     INTEGER
}

SEQUENCESEQUENCE OF 的区别在于 SEQUENCE OF 构造的元素必须属于同一类型。 请参阅以下示例。 两个构造在编码时 (0x30) 具有相同的标记值。

PolicyQualifiers ::=  SEQUENCE OF PolicyQualifierInfo

PolicyQualifierInfo ::= SEQUENCE 
{
   policyQualifierId   OBJECT IDENTIFIER,
   qualifier           ANY OPTIONAL
}

了解 SEQUENCESEQUENCE OF 之间的差异的另一种方法是将它们与 C 编程语言中的对应项进行比较。 也就是说, SEQUENCE 大致等效于结构, SEQUENCE OF 大致等效于数组。

SET 和 SET OF

编码标记:0x31

包含一个或多个类型的无序字段系列。 这与包含有序列表的 SEQUENCE 不同。 通过指定无序列表,应用程序可以按最合适的顺序向编码器提供结构字段。 与 SEQUENCE 一样, SET 构造的字段可以标记为 OPTIONALDEFAULT,并且必须使用唯一标识符来消除解码过程的歧义。 SETSET OF 的区别在于,SET OF 构造的元素必须属于同一类型。

Name ::= SEQUENCE OF RelativeDistinguishedName

RelativeDistinguishedName ::= SET OF AttributeTypeValue

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

选择

编码标记:不适用

定义替代方案之间的选择。 每个替代项都必须由带括号的整数唯一标识,以避免解码时出现歧义。 编码后, CHOICE 构造将具有所选替代项的编码标记值。

AltNames ::= SEQUENCE OF GeneralName

GeneralNames ::= AltNames

GeneralName ::= CHOICE 
{
   otherName               [0] IMPLICIT OtherName,
   rfc822Name              [1] IMPLICIT IA5String,
   dNSName                 [2] IMPLICIT IA5String,
   x400Address             [3] IMPLICIT SeqOfAny,
   directoryName           [4] EXPLICIT Name,
   ediPartyName            [5] IMPLICIT SEQUENCE OF ANY,
   uniformResourceLocator  [6] IMPLICIT IA5String,
   iPAddress               [7] IMPLICIT OCTET STRING,
   registeredID            [8] IMPLICIT OBJECT IDENTIFIER
}

ASN.1 类型系统

ASN.1 类型的 DER 编码

可辨别编码规则