>  기사  >  백엔드 개발  >  Go의 X509 인증서에서 주체 DN을 어떻게 추출할 수 있나요?

Go의 X509 인증서에서 주체 DN을 어떻게 추출할 수 있나요?

Barbara Streisand
Barbara Streisand원래의
2024-11-01 02:44:28339검색

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

Go의 X509 인증서에서 주체 DN 추출

Go의 X509 인증서에서 전체 주체 또는 발급자 DN을 문자열로 가져오는 방법은 다음과 같습니다. 도전. pkix.Name 유형은 DN 검색을 위한 간단한 String() 메소드를 제공하지 않습니다.

제공되는 솔루션:

이 문제를 해결하기 위해 사용자 정의 함수를 구현할 수 있습니다. pkix.Name을 DN의 문자열 표현으로 변환하려면:

<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>

이 함수는 pkix.Name 인스턴스와 구분 기호를 입력으로 사용하고 개별 OID 값과 해당 값을 문자열로 결합합니다. DN 표현.

사용:

주제 DN을 얻으려면:

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

발급자 DN을 얻으려면:

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

출력은 전체 DN을 나타내는 문자열입니다.

예:

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

위 내용은 Go의 X509 인증서에서 주체 DN을 어떻게 추출할 수 있나요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.