代码之家  ›  专栏  ›  技术社区  ›  codefx

如何解析DER字节?

  •  5
  • codefx  · 技术社区  · 6 年前

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

    1 回复  |  直到 4 年前
        1
  •  5
  •   dave_thompson_085    6 年前

    大部分都是骗人的 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表示组件的整数值 完整对象标识符:

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

    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的国家的成员机构之下,并且没有这样的国家。