大部分都是骗How does ASN.1 encode an object identifier?
(X.509=PKIX) SAN 扩展值的编码在 rfc5280 中定义为:
SubjectAltName ::= GeneralNames
GeneralNames ::= SEQUENCE SIZE (1..MAX) OF GeneralName
GeneralName ::= CHOICE { // tags implicit
otherName [0] AnotherName,
rfc822Name [1] IA5String,
dNSName [2] IA5String,
x400Address [3] ORAddress,
directoryName [4] Name,
ediPartyName [5] EDIPartyName,
uniformResourceIdentifier [6] IA5String,
iPAddress [7] OCTET STRING,
registeredID [8] OBJECT IDENTIFIER }
对于这个 CHOICE,您的第一个八位字节 0x88 是特定于上下文的 #8(表示已注册 ID)的标记值,您的第二个八位字节 0x05 是该值的长度,编码为 0x2A 0x03 0x04 0x05 0x05。由于该值是一个对象标识符,要对其进行解码,请查看 Kaliski 文档中 OBJECT IDENTIFIER 下的编码部分:
BER 编码。 原语。内容八位字节如下,其中
value1, ..., valuen 表示组件中的整数值
完整的对象标识符:
第一个八位字节的值是 40 * value1 + value2。 (这是明确的,因为 value1 被限制为值 0、1 和 2;value2 是
当 value1 为 0 或 1 时,限制在 0 到 39 的范围内;并且,根据
X.208,n 始终至少为 2。)
以下八位字节(如果有)对 value3、...、valuen 进行编码。每个值都以 128 为基数编码,最高有效位在前,最少
尽可能多的数字,以及每个八位字节的最高有效位,除了
值的编码中的最后一个设置为“1”。
第一个值 octet 0x2A 是十进制 42 和 42 = 40 * 1 + 2,因此 OID 的前两个组件是 1 和 2。所有剩余的八位字节都没有设置它们的最高有效位,因此它们每个对一个组件进行编码:3 4 5 5。由组件 1 2 3 4 5 5 组成的 OID 采用通常的简写符号 1.2.3.4.5.5(但还有其他等效符号,如 Kaliski 所示)。
顺便说一句,该 OID 无效,因为它必须在 ISO3166 数字代码 3 的国家/地区的成员机构下,并且没有这样的国家/地区。