Heim  >  Artikel  >  Backend-Entwicklung  >  Wie kann ich den Betreff-DN aus einem X509-Zertifikat in Go extrahieren?

Wie kann ich den Betreff-DN aus einem X509-Zertifikat in Go extrahieren?

Barbara Streisand
Barbara StreisandOriginal
2024-11-01 02:44:28331Durchsuche

How can I extract the Subject DN from an X509 certificate in Go?

Extrahieren des Betreff-DN aus X509-Zertifikaten in Go

Erhalten des vollständigen Betreff- oder Aussteller-DN aus einem X509-Zertifikat in Go als Zeichenfolge eine Herausforderung. Der Typ pkix.Name bietet keine einfache String()-Methode zum Abrufen des DN.

Bereitgestellte Lösung:

Um dieses Problem zu beheben, kann eine benutzerdefinierte Funktion implementiert werden um den pkix.Name in eine String-Darstellung des DN umzuwandeln:

<code class="go">import (
    "fmt"
    "strings"

    pkix "github.com/google/certificate-transparency-go/x509"
)

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
}</code>

Diese Funktion verwendet eine pkix.Name-Instanz und ein Trennzeichen als Eingabe und kombiniert die einzelnen OID-Werte und ihre entsprechenden Werte zu einem String Darstellung der DN.

Verwendung:

Um die Betreff-DN zu erhalten:

<code class="go">subj, err := getDNFromCert(cert.Subject, "/")
if err != nil {
    // Error handling
}</code>

Um die Aussteller-DN zu erhalten:

<code class="go">issuer, err := getDNFromCert(cert.Issuer, "/")
if err != nil {
    // Error handling
}</code>

Die Ausgabe ist eine Zeichenfolge, die den vollständigen DN darstellt.

Beispiel:

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

Das obige ist der detaillierte Inhalt vonWie kann ich den Betreff-DN aus einem X509-Zertifikat in Go extrahieren?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn