2016-08-24 14 views
2

x509証明書の完全なサブジェクトDN(または発行者DN)を文字列として取得する簡単な方法はありますか?golang subject dn from x509証明書

私は ".String()" pkix.Name

答えて

3

におけるソリューション(同僚のおかげで)のような任意の方法を見つけることができませんでした:関数を呼び出す

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 
} 

を:

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

出力(例):

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

これは唯一の「簡単な」解決策であるようです

関連する問題