golang主题dn来自x509证书 [英] golang subject dn from x509 cert

查看:439
本文介绍了golang主题dn来自x509证书的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

是否有任何简单的方法可以将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:首字母缩写,
2.5.4.44:生成质量,
2.5.4.46:dnQualifier,
2.5.4.65:化名,
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()];好的{
//< oid名称> =<值>
subject = append(subject,fmt.Sprintf(%s =%s,name,v))
} else {
//< oid> =< value>如果没有< oid名称>被找到
subject = append(subject,fmt.Sprintf(%s =%s,i.Type.String(),v))
}
} else {
//< oid> =<默认格式的值>如果值不是字符串
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 {
//执行错误处理
}
fmt.Println(subj)

输出(示例):

  / C = US / O =某个组织/ OU =单位/ CN =通用名称

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


Is there any easy way to get the complete subject DN (or issuer DN) from an x509 certificate in go as a string?

I was not able to find any methods like ".String()" in pkix.Name

解决方案

Solution (thanks to a colleague):

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, fmt.Sprintf("%s=%s", 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
}

calling the function:

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

output (example):

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

this seems to be the only "easy" solution

这篇关于golang主题dn来自x509证书的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆