如何在golang的x509证书中解码复合自定义扩展名?使用当前代码,错误为:asn1:结构错误:序列标签不匹配

问题描述 投票:0回答:1

我正在编写golang代码以解析具有自定义扩展名的X509证书:enter image description here

代码如下:

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之外,我都能解组所有其余部分。

我正在编写golang代码以解析具有自定义扩展名的X509证书:代码如下:func(e * PckCert)ParseValue()error {var ext pkix.Extension var err error for i:= 0; i <...>

基本上,您需要区分常规扩展名和集合。如果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")
    }
}
go x509certificate x509 asn.1 pkix
1个回答
0
投票

基本上,您需要区分常规扩展名和集合。如果OID是集合,则需要传递[] asn1.RawValue类型的切片,就像在上面的代码中解析e.PckCertObj.Extensions [i]一样。

© www.soinside.com 2019 - 2024. All rights reserved.