【问题标题】:Go invalid ASN.1 Object Identifier encoding errorGo invalid ASN.1 Object Identifier encoding error
【发布时间】:2018-05-26 02:47:39
【问题描述】:

我正在尝试使用 encoding/asn1 创建一个 DER 文件,但我不断收到无效的对象标识符运行时错误。 asn1.ObjectIdentifier 只是一个 []int,所以我不确定什么是无效的。

package main

import (
    "encoding/asn1"
    "fmt"
    "log"
)

type algorithm struct {
    Algo asn1.ObjectIdentifier
    Null asn1.RawValue
}

func main() {
    var myCert algorithm
    myCert.Algo = asn1.ObjectIdentifier{42, 134, 72, 134}
    myCert.Null = asn1.NullRawValue

    mdata, err := asn1.Marshal(myCert)
    if err != nil {
        log.Fatalln(err)
    }

    fmt.Println(mdata)
}

程序退出并出现以下错误: “asn1:结构错误:无效的对象标识符”

游乐场示例here

【问题讨论】:

  • 您确定 {42, 134, 72, 134} 有效吗?我试过 {0, 6 ,2} 没问题,这里是obj-sys.com/asn1tutorial/node10.html
  • 为了这个问题,我确实稍微调整了值。原始 TLV 是来自 X.509 证书的算法标识符。我试图复制的十六进制编码 TLV 是:“06 09 2A864886F70D010101”。 06h 当然是对象标识符标签,09h 是长度,2A864886F70D010101 是对象的值。逐字节,值在base10中转换为{42, 134, 72, 134, 247, 13, 1, 1, 1}并失败。根据下面@YaFred 的回答,我转换错了吗?
  • 那么它是有效的play.golang.org/p/5euH7x1tByM
  • 要获取编码值 '06092A864886F70D010101'H,您必须使用此 OID:{ 1 2 840 113549 1 1 1 }
  • @YaFred,你能解释一下为什么会这样吗?这与“ANY”类型有关吗?

标签: go asn.1 der


【解决方案1】:

对象标识符不是直截了当的。

只有 3 个顶级弧(构成对象标识符的整数)。 换句话说,第一个弧(在您的示例中为 42)只能是 0、1 或 2

如果你的第一个弧是 0 或 1,那么第二个弧必须小于 40

注意:对象标识符值的编码规则使用此限制来打包前 2 个弧

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-27
    • 2015-04-14
    • 2021-11-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多