大部分都是骗人的
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 }
对于此选择,第一个八位字节0x88是特定于上下文的#8的标记值(表示registeredID),第二个八位字节0x05是值的长度,编码为0x2A 0x03 0x04 0x05 0x05。由于该值是一个对象标识符,要对其进行解码,请查看Kaliski文档中对象标识符下的编码部分:
BER编码。
原始的内容八位字节如下,其中
值1。。。,valuen表示组件的整数值
完整对象标识符:
-
第一个八位字节的值为40*值1+值2。(这是明确的,因为value1仅限于值0、1和2;value2是
当value1为0或1时,限制在0到39的范围内;根据
十、 208,n始终至少为2。)
-
以下八位字节(如果有)编码值3。。。,价值。每个值都是以128为基数编码的,最重要的数字排在第一位,并且
尽可能多的数字,以及每个八位字节的最有效位,除了
值编码中的最后一个设置为“1”
第一个值八位字节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的国家的成员机构之下,并且没有这样的国家。