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

如何在golang的x509证书中解码复合自定义扩展?当前代码错误为:asn1:结构错误:序列标记不匹配,go,x509certificate,x509,asn.1,pkix,Go,X509certificate,X509,Asn.1,Pkix,我正在编写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 { ///

我正在编写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**
                }
            }
        }
    }
}
func(e*PckCert)ParseValue()错误{
var ext pkix.Extension
变量错误
对于i:=0;i
}


上述代码仅在复合扩展序列TC OID中失败对于复合扩展序列,我得到“asn1:结构错误:序列标记不匹配”。请提供帮助。。我能够解组除复合扩展TC OID之外的所有其他扩展。

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

那么,您如何知道扩展是否具有值或集合。您需要从asn字节流中提取标识的对象(OID),如下所示

变量oid asn1.ObjectIdentifier
rest,:=asn1.Ummarshal(字节和oid)
然后可以与特定OID进行比较

如果oid.Equal(knownCollectionOID){
var collExts[]asn1.RawValue
asn1.解组(剩余和集合)
对于ux,ext:=范围collExts{
fmt.Println(“对扩展做点什么”)
}
}