如何解析DER字节?

cod*_*efx 5 asn.1 go

我正在尝试为Elasticsearch Searchguard创建证书.一个要求是证书必须包含oid:1.2.3.4.5.5在SAN中.我正在使用GO来生成该证书.在经过一些试验和错误之后,我发现如果我使用[]byte{0x88, 0x05, 0x2A, 0x03, 0x04, 0x05, 0x05}Raw ASN.1字节,这将转变oid:1.2.3.4.5.5为SAN.我想了解这些字节如何表示该值oid:1.2.3.4.5.5.我读过这个,但我仍然感到困惑.你能帮我理解这个[]字节代表oid:1.2.3.4.5.5什么吗?

dav*_*085 5

主要是dupe ASN.1如何编码对象标识符?

(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 }
Run Code Online (Sandbox Code Playgroud)

对于此CHOICE,您的第一个八位字节0x88是特定于上下文的#8(表示registeredID)的标记值,而您的第二个八位字节0x05是该值的长度,编码为0x2A 0x03 0x04 0x05 0x05.由于此值是对象标识符,因此要对其进行解码,请查看Kaliski文档中OBJECT IDENTIFIER下的编码部分:

BER编码.原始.内容八位字节如下,其中value1,...,valuen表示完整对象标识符中组件的整数值:

  1. 第一个八位字节的值为40*value1 + value2.(这是明确的,因为value1限于值0,1和2;当value1为0或1时,value2被限制在0到39的范围内;并且,根据X.208,n总是至少为2.)

  2. 以下八位字节(如果有)编码value3,...,valuen.每个值编码为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的国家的成员主体下,并且没有这样的国家.