5

我需要在证书中指定注册 ID。

因此,当使用 OpenSSL 签署证书时,我将其添加到配置文件中。

[ alternate_names ]
DNS.1 = localhost
RID.1 = 1.2.3.4.5.5

这里1.2.3.4.5.5是 OID。

我遵循了如何在 Stack Overflow 的 openssl.cnf 文件中格式化 OID Subject Alt Name 条目。

现在,我想在 Go 中生成证书。下面一个是我当前的配置

cfg := cert.Config{
    CommonName:   name,
    Organization: []string{"Elasticsearch Operator"},
    AltNames: cert.AltNames{
        DNSNames: []string{
            "localhost",
        },
    },
    Usages: []x509.ExtKeyUsage{
        x509.ExtKeyUsageServerAuth,
        x509.ExtKeyUsageClientAuth,
    },
}

在此配置中,如何添加 OID 号。

4

1 回答 1

5

没有直接的方法可以使用 Go 在证书中添加 OBJECT IDENTIFIER。

我们找到了一个定制的解决方案。

Go 提供了在证书中添加其他 SAN 信息的选项

x509.Certificate{
    ExtraExtensions: []pkix.Extension{
        {
            // Here, We add SAN additional with specific ID
        },
    },
}

根据2.5.29.17 - Subject Alternative Name,SAN 的 OID 是2.5.29.17

可以说,我们将1.2.3.4.5.5在 SAN 中添加注册 ID。并且此 RID 需要添加为 Tag #8。(根据2.5.29.17

所以这个扩展的字节值是[]byte{0x88, 0x05, 0x2A, 0x03, 0x04, 0x05, 0x05}

这里,

  • 0x88是特定于上下文的标记值#8
  • 0x05是编码值的长度
  • 0x2A, 0x03, 0x04, 0x05, 0x05是编码值1.2.3.4.5.5
    • 0x2A来自42其中 is 40 * 1 + 2, 这里12是 ID 的前两个值。

所以,最后

rawValue := []asn1.RawValue{
    {FullBytes: []byte{0x88, 0x05, 0x2A, 0x03, 0x04, 0x05, 0x05}},
}
rawByte, _ := asn1.Marshal(rawValue)

_ = x509.Certificate{
    ExtraExtensions: []pkix.Extension{
        {
            Id:    asn1.ObjectIdentifier{2, 5, 29, 17},
            Value: rawByte,
        },
    },
}
于 2018-02-17T06:20:44.733 回答