【问题标题】:How to parse DER bytes?如何解析 DER 字节?
【发布时间】:2017-12-20 23:11:44
【问题描述】:

我正在尝试为Elasticsearch Searchguard 创建证书。一项要求是证书必须在 SAN 中包含 oid:1.2.3.4.5.5。我正在使用 GO 生成该证书。经过反复试验,我发现如果我使用 []byte{0x88, 0x05, 0x2A, 0x03, 0x04, 0x05, 0x05} 作为原始 ASN.1 字节,这将在 SANs 中变成 oid:1.2.3.4.5.5 。我想了解这些字节如何表示值oid:1.2.3.4.5.5。我已经阅读了this,但我仍然感到困惑。你能帮我理解一下这个 []byte 是如何表示oid:1.2.3.4.5.5的吗?

【问题讨论】:

    标签: go asn.1 search-guard


    【解决方案1】:

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

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

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

    【讨论】:

    • 非常感谢@dave_thompson_085 的解释!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-14
    相关资源
    最近更新 更多