我正在尝试为Elasticsearch Searchguard创建证书。一个要求是证书必须在SAN中包含oid:1.2.3.4.5.5
。我正在使用GO来生成该证书。经过一些反复试验后,我发现如果我使用[]byte{0x88, 0x05, 0x2A, 0x03, 0x04, 0x05, 0x05}
作为原始ASN.1字节,则会在SAN中变为oid:1.2.3.4.5.5
。我想了解这些字节如何表示值oid:1.2.3.4.5.5
。我看过this,但我仍感到困惑。你能帮我理解这个[]字节代表oid:1.2.3.4.5.5
吗?
答案 0 :(得分:5)
主要是欺骗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(表示registeredID)的标记值,而您的第二个八位字节0x05是该值的长度,其编码为0x2A 0x03 0x04 0x05 0x05。由于此值是对象标识符,因此要对其进行解码,请查看Kaliski文档中OBJECT IDENTIFIER下的编码部分:
BER编码。原语。内容八位字节如下,其中 value1,...,valuen表示组件中的组件的整数值 完整的对象标识符:
第一个八位位组的值为40 * value1 + value2。 (这是明确的,因为value1限于值0,1和2; value2是 当value1为0或1时,限制在0到39的范围内;并且,根据 X.208,n总是至少为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的国家/地区成员机构下,并且没有此类国家/地区。