如何用Go从SSL证书Subject中获取UnstructuredName值(Python迁移)
Go中提取SSL证书Subject的UnstructuredName值
UnstructuredName对应的OID是1.2.840.113549.1.9.2,Go标准库的crypto/x509包没有预定义这个字段的解析逻辑,所以解析证书后,该值会被放入Subject.ExtraNames切片中,需要手动匹配OID并解码原始ASN.1数据。
解决步骤
- 定义UnstructuredName的OID常量
- 遍历
Subject.ExtraNames,找到匹配OID的条目 - 解码条目内的原始ASN.1数据(UnstructuredName的值为UTF8String类型)
完整示例代码
package main import ( "crypto/x509" "encoding/asn1" "fmt" "log" ) const unstructuredNameOID = "1.2.840.113549.1.9.2" func getUnstructuredName(cert *x509.Certificate) (string, error) { oid := asn1.ObjectIdentifier{} if err := oid.UnmarshalText([]byte(unstructuredNameOID)); err != nil { return "", err } for _, name := range cert.Subject.ExtraNames { if name.Type.Equal(oid) { var value string if _, err := asn1.Unmarshal(name.Value, &value); err != nil { return "", err } return value, nil } } return "", fmt.Errorf("unstructured name not found in certificate subject") } func main() { // 替换为实际证书的DER/PEM数据 certData := []byte("...") cert, err := x509.ParseCertificate(certData) if err != nil { log.Fatal(err) } name, err := getUnstructuredName(cert) if err != nil { log.Fatal(err) } fmt.Println("UnstructuredName:", name) }
补充说明
- 原Python代码借助cryptography库可直接按OID取值,Go因标准库未内置该OID的映射,所以需要手动处理
ExtraNames字段 name.Value是未解码的ASN.1字节流,通过asn1.Unmarshal可直接解析为字符串,因为UnstructuredName的ASN.1类型为UTF8String
内容的提问来源于stack exchange,提问作者kstieger
相关产品推荐
相关产品推荐

