如何在golang的x509证书中解码复合自定义扩展?当前代码错误为:asn1:结构错误:序列标记不匹配
我正在编写golang代码来解析带有自定义扩展名的X509证书: 代码如下:如何在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 { ///
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(“对扩展做点什么”)
}
}