golang主题dn来自x509证书 [英] golang subject dn from x509 cert
本文介绍了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屋!
查看全文