ホームページ >バックエンド開発 >Golang >Go で X509 証明書からサブジェクト DN を抽出するにはどうすればよいですか?

Go で X509 証明書からサブジェクト DN を抽出するにはどうすればよいですか?

Barbara Streisand
Barbara Streisandオリジナル
2024-10-31 04:44:02449ブラウズ

How to Extract the Subject DN from an X509 Certificate in Go?

Go で X509 証明書からサブジェクト DN を抽出する方法

Go で X509 証明書から完全なサブジェクト識別名 (DN) を取得する文字列は難しい場合があります。 pkix.Name 型には専用の ".String()" メソッドがありませんが、多面的な解決策があります。

解決策:

次の関数は、事前定義されたOID を意味のあるフィールド名に変換するマップ (例: Common Name の「CN」):

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

    "crypto/x509"
    "crypto/x509/pkix"
)

var oid = map[string]string{
    "2.5.4.3":  "CN",
    "2.5.4.6":  "C",
    "2.5.4.7":  "L",
    "2.5.4.8":  "ST",
    "2.5.4.10": "O",
    "2.5.4.11": "OU",
    "1.2.840.113549.1.9.1": "emailAddress",
}

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 {
                    subject = append(subject, fmt.Sprintf("%s=%s", i.Type.String(), v))
                }
            } else {
                subject = append(subject, fmt.Sprintf("%s=%v", i.Type.String(), v))
            }
        }
    }
    return sep + strings.Join(subject, sep), nil
}</code>

Usage:

サブジェクト DN を抽出するには、次のような関数:

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

出力例:

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

以上がGo で X509 証明書からサブジェクト DN を抽出するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。