Heim > Backend-Entwicklung > Golang > 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
Freigeben: 2024-11-01 02:44:28
Original
425 Leute haben es durchsucht

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>
Nach dem Login kopieren

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>
Nach dem Login kopieren

Um die Aussteller-DN zu erhalten:

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

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

Beispiel:

/CN=common name/OU=unit/O=some organization/C=US
Nach dem Login kopieren

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!

Quelle:php.cn
Erklärung dieser Website
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
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage