5

我正在尝试为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.5SANs 。我想了解这些字节如何表示 value oid:1.2.3.4.5.5。我读过这个,但我仍然很困惑。你能帮我理解这个 []byte 代表oid:1.2.3.4.5.5什么吗?

4

1 回答 1

5

主要是骗人的 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 }

对于这个 CHOICE,您的第一个八位字节 0x88 是特定于上下文的 #8(意思是注册 ID)的标记值,您的第二个八位字节 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 的国家的成员机构下,并且没有这样的国家。

于 2017-12-21T02:56:43.610 回答