如何从 Golang 证书中获取 CN

3
有没有办法在Golang中从X509Certificate中提取CN?
之前我们在Java中做了类似于这样的操作。
private String getCNFromCertificate() throws InvalidNameException, CertificateException, IOException {
      X509Certificate certificate = getCert(DeploymentConfiguration.getPemCertPath().get());
      String commonName = new LdapName(certificate.getSubjectX500Principal().getName()).getRdns().stream()
              .filter(i -> i.getType().equalsIgnoreCase("CN")).findFirst().get().getValue().toString();
        return commonName;
}

有哪些Golang的包可以执行类似的任务呢?或者说,从Golang证书中提取CN有什么更好的选择呢?

先行致谢。

2个回答

1
如何加载和解析公共证书的要点如下:
bs, err := os.ReadFile("/tmp/google.crt")  // handle error

block, _ := pem.Decode(bs)
if block == nil {
    log.Fatal("failed to parse PEM block containing the public key")
}

cert, err := x509.ParseCertificate(block.Bytes) // handle error

log.Printf("Subject:   %q", cert.Subject)

// Subject:   "CN=*.google.com"

警告:自go 1.15版本起,使用CN存储主机名已被弃用

默认情况下,当X.509证书上没有Subject Alternative Names时,将CommonName字段视为主机名的已弃用和旧行为已被禁用。可以通过在GODEBUG环境变量中添加x509ignoreCN = 0来临时重新启用它。

如果要在证书中查找主机名(或主机名通配符),应使用SAN(Subject Alternative Names)部分 - 其中有一个DNS部分。这在x509.Certificate 结构的 DNSNames 字段中体现:

log.Printf("DNS names: %+v", cert.DNSNames)

// DNS names: [*.google.com *.appengine.google.com *.bdn.dev *.origin-test.bdn.dev *.cloud.google.com ...

Playground Example


0
问题不太明确,我认为:在 X.509 证书中没有“CN”这样的东西。 CN 是“通用名称”的缩写,是一种在 X.509 PKI 中引用实体的形式之一。您可能需要的是证书的“主题”字段,也就是该证书颁发给的实体。
如果是这样,您需要 x509.CertificateSubject 字段,它是一种特殊的复合数据类型,包含了 CommonName 等内容。
请参见 this,了解 CN 在命名实体方面所占的位置的快速概述。 crypto/x509 是 Go 标准库提供的一个库存包。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接