加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

来自x509证书的golang主题dn

发布时间:2020-12-16 09:27:30 所属栏目:大数据 来源:网络整理
导读:有没有简单的方法从x509证书中获取完整的主题DN(或发行者DN)作为字符串? 我无法在pkix.Name中找到任何类似“.String()”的方法 解决方法 解决方案(感谢同事): var oid = map[string]string{ "2.5.4.3": "CN","2.5.4.4": "SN","2.5.4.5": "serialNumber","2
有没有简单的方法从x509证书中获取完整的主题DN(或发行者DN)作为字符串?

我无法在pkix.Name中找到任何类似“.String()”的方法

解决方法

解决方案(感谢同事):

var oid = map[string]string{
    "2.5.4.3":                    "CN","2.5.4.4":                    "SN","2.5.4.5":                    "serialNumber","2.5.4.6":                    "C","2.5.4.7":                    "L","2.5.4.8":                    "ST","2.5.4.9":                    "streetAddress","2.5.4.10":                   "O","2.5.4.11":                   "OU","2.5.4.12":                   "title","2.5.4.17":                   "postalCode","2.5.4.42":                   "GN","2.5.4.43":                   "initials","2.5.4.44":                   "generationQualifier","2.5.4.46":                   "dnQualifier","2.5.4.65":                   "pseudonym","0.9.2342.19200300.100.1.25": "DC","1.2.840.113549.1.9.1":       "emailAddress","0.9.2342.19200300.100.1.1":  "userid",}

func getDNFromCert(namespace pkix.Name,sep string) (string,error) {
    subject := []string{}
    for _,s := range namespace.ToRDNSequence() {
        for _,i := range s {
            if v,ok := i.Value.(string); ok {
                if name,ok := oid[i.Type.String()]; ok {
                    // <oid name>=<value>
                    subject = append(subject,fmt.Sprintf("%s=%s",name,v))
                } else {
                    // <oid>=<value> if no <oid name> is found
                    subject = append(subject,i.Type.String(),v))
                }
            } else {
                // <oid>=<value in default format> if value is not string
                subject = append(subject,fmt.Sprintf("%s=%v",i.Type.String,v))
            }
        }
    }
    return sep + strings.Join(subject,sep),nil
}

调用函数:

subj,err := getDNFromCert(x509Cert.Subject,"/")
if err != nil {
   // do error handling
}
fmt.Println(subj)

输出(例子):

/C=US/O=some organization/OU=unit/CN=common name

这似乎是唯一“简单”的解决方案

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读