首页  >  文章  >  后端开发  >  如何从 Go 中的 X.509 证书中提取完整的主题专有名称?

如何从 Go 中的 X.509 证书中提取完整的主题专有名称?

DDD
DDD原创
2024-11-01 02:18:02272浏览

How to Extract the Full Subject Distinguished Name from an X.509 Certificate in Go?

如何从 Go 中的 X509 证书中提取完整的主题 DN

从 X509 证书获取主题 DN(可分辨名称)或颁发者 DN在 Go 中作为字符串可能是一个挑战。不过,有一个方便的方法可以简化此任务。

解决方案

感谢同事的贡献,开发了一个名为 getDNFromCert 的自定义函数来提取X509 证书中的完整 DN。此函数采用 pkix.Name 命名空间作为输入,并返回 DN 的字符串表示形式:

<code class="go">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>

使用函数

从X509证书名为x509Cert,您可以调用 getDNFromCert 函数:如下所示:

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

示例输出

对于具有以下主题 DN 的示例证书:

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

getDNFromCert 函数将返回以下字符串:

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

此方法提供了一种简单有效的提取方法Go 中 X509 证书的完整主体或颁发者 DN。它简化了任务并消除了手动字符串操作的需要。

以上是如何从 Go 中的 X.509 证书中提取完整的主题专有名称?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn