go - 如何在golang的x509证书中解码复合自定义扩展?使用当前代码错误是:asn1:结构错误:序列标签不匹配
问题描述
我正在编写 golang 代码来解析带有自定义扩展的 X509 证书:
代码如下:
func (e *PckCert) ParseValue() error {
var ext pkix.Extension
var err error
for i := 0; i < len(e.PckCertObj.Extensions); i++ {
ext = e.PckCertObj.Extensions[i]
if ExtxOid.Equal(ext.Id) == true { ///ExtOid is a constant OId is known
var asn1Extensions []asn1.RawValue
_, err := asn1.Unmarshal(ext.Value, &asn1Extensions)
if err != nil {
log.Info("err: ", err)
return errors.Wrap(err, "Asn1 Extension Unmarshal failed")
}
var sExtension pkix.Extension ///For normal OIDs
var sExtensions1 []pkix.Extension /// For TC1 SVN OID extensions under extension
for j := 0; j < len(asn1Extensions); j++ {
_, err = asn1.Unmarshal(asn1Extensions[j].FullBytes, &sExtension)
if err != nil {
log.Info("err came: ", err)
log.Info("Warning: Asn1 Extension Unmarshal failed - 2 for index:", j)
_, err = asn1.Unmarshal(asn1Extensions[j].FullBytes, &sExtensions1)
if err != nil {
log.Info("err came 2: ", err) ///**for extensions within extensions here code is failing with error: sequence tag mismatch**
}
}
}
}
}
}
上述代码仅对复合扩展序列 TC OID失败。对于复合扩展序列,我得到“asn1:结构错误:序列标签不匹配”。请在这方面提供帮助。.我能够解组除复合扩展 TC OID 之外的所有其余部分
解决方案
基本上,您需要区分常规扩展和集合。如果 OID 是一个集合,您需要传入 []asn1.RawValue 类型的切片,就像在上面的代码中解析 e.PckCertObj.Extensions[i] 一样。
那么,你怎么知道是否有带有值或集合的扩展。您需要从 asn 字节流中提取对象标识 (OID),如下所示
var oid asn1.ObjectIdentifier
rest, _ := asn1.Ummarshal(bytes, &oid)
然后,您可以与特定的 OID 进行比较
if oid.Equal(knownCollectionOID) {
var collExts []asn1.RawValue
asn1.Unmarshal(rest, &collExts)
for _, ext := range collExts {
fmt.Println("Do something with the extension")
}
}
推荐阅读
- android - 溢出-x:滚动!重要不能在三星互联网上使用翻译的 SVG
- kubernetes - Openshift:oc登录失败
- python - 有没有办法在 Blender 中使用 python 脚本复制/粘贴动作关键帧?
- c# - 用户角色限制访问某些用户以显示某些页面
- git - 在构建结束时提交/推送更改到 Azure DevOps 存储库
- reactjs - React 子组件(Typescript)在第三次渲染之前不会保留状态
- python-3.x - 在列表理解中使用错误处理将字符串转换为浮点数
- angular-cli-v7 - 如何使用 Angular 8 构建 bundle.js?
- java - Map(带操作)Stream java 8、nestedList
- javascript - 在 wordpress 中运行笑话测试时如何修复 import {} 意外令牌