You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Go使用encoding/asn1生成DER文件时遇无效OID编码错误求助

解决Go encoding/asn1包生成DER时的「invalid object identifier」错误

这个报错的核心原因是你定义的对象标识符(OID)违反了ASN.1标准的编码规则——哪怕asn1.ObjectIdentifier本质是[]int类型,它的元素也不是随便填的。

ASN.1对OID的结构有严格要求:

  • 第一个整数只能是0、1或2
    • 如果第一个值是0或1,第二个整数的取值必须在0到39之间
    • 如果第一个值是2,第二个整数可以是任意非负整数

你代码里用的{42, 134, 72, 134}第一个元素是42,完全不符合上述规则,所以asn1.Marshal时会抛出结构错误。

修正后的代码示例

我们把OID换成一个合法的示例(比如自定义的合规OID{2, 1, 3, 4}),代码就能正常运行了:

package main

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

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

func main() {
	var myCert algorithm
	// 使用符合ASN.1规则的OID
	myCert.Algo = asn1.ObjectIdentifier{2, 1, 3, 4}
	myCert.Null = asn1.NullRawValue
	mdata, err := asn1.Marshal(myCert)
	if err != nil {
		log.Fatalln(err)
	}
	fmt.Printf("生成的DER数据: %v\n", mdata)
}

补充说明

如果是要表示某个标准OID(比如哈希算法、加密算法的OID),可以直接用Go标准库中预定义的常量,比如:

  • asn1.ObjectIdentifier{1, 2, 840, 113549, 1, 1, 1} 对应RSA加密算法
  • asn1.ObjectIdentifier{2, 16, 840, 1, 101, 3, 4, 2, 1} 对应SHA-256哈希算法

这些预定义的OID都严格遵循ASN.1规则,不会触发类似错误。

内容的提问来源于stack exchange,提问作者Sap

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 06:53:02