golang subject dn from x509 cert

前端 未结 7 2176
爱一瞬间的悲伤
爱一瞬间的悲伤 2020-12-18 08:10

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()\"

7条回答
  •  粉色の甜心
    2020-12-18 08:54

    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 {
                        // =
                        subject = append(subject, fmt.Sprintf("%s=%s", name, v))
                    } else {
                        // = if no  is found
                        subject = append(subject, fmt.Sprintf("%s=%s", i.Type.String(), v))
                    }
                } else {
                    // = 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

提交回复
热议问题