You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 12:15:32