【问题标题】:How to parse custom X509v3 extension in golang?如何在 golang 中解析自定义 X509v3 扩展?
【发布时间】:2021-12-05 06:06:09
【问题描述】:

我有一个 client.crt.pem。

我想获取自定义扩展键值。

(例如

2.9.1.6.2.6.1.9.9.4.1G1,

2.9.1.6.2.6.1.9.9.4.10C024731

)。

如何在 golang 中解析它们?

这是证书信息。

使用openssl x509 -in client.crt.pem -noout -text 显示它。

...
...
        X509v3 extensions:
            X509v3 Basic Constraints:
                CA:FALSE
            Netscape Cert Type:
                SSL Client, S/MIME
            Netscape Comment:
                OpenSSL Generated Client Certificate
            X509v3 Key Usage: critical
                Digital Signature, Non Repudiation, Key Encipherment
            X509v3 Extended Key Usage:
                TLS Web Client Authentication, E-mail Protection
            2.9.1.6.2.6.1.9.9.4.1:
                ..G1
            2.9.1.6.2.6.1.9.9.4.2:
                ..R1
            2.9.1.6.2.6.1.9.9.4.3:
                ..3
            X509v3 Subject Alternative Name:
                IP Address:127.0.0.1, IP Address:0:0:0:0:0:0:0:1, DNS:localhost
...
...

或使用openssl asn1parse -i -in client.crt.pem

...
...
  998:d=4  hl=2 l=  18 cons:     SEQUENCE
 1000:d=5  hl=2 l=  10 prim:      OBJECT            :2.9.1.6.2.6.1.9.9.4.1
 1012:d=5  hl=2 l=   4 prim:      OCTET STRING      [HEX DUMP]:0C024731
 1018:d=4  hl=2 l=  18 cons:     SEQUENCE
 1020:d=5  hl=2 l=  10 prim:      OBJECT            :2.9.1.6.2.6.1.9.9.4.2
 1032:d=5  hl=2 l=   4 prim:      OCTET STRING      [HEX DUMP]:0C025231
 1038:d=4  hl=2 l=  17 cons:     SEQUENCE
 1040:d=5  hl=2 l=  10 prim:      OBJECT            :2.9.1.6.2.6.1.9.9.4.3
 1052:d=5  hl=2 l=   3 prim:      OCTET STRING      [HEX DUMP]:0C0133
...
...

【问题讨论】:

  • 你试过什么?你能在 Go 中解析 x509 吗?
  • 嗨,@rustyx,我已经添加了我的答案。我不确定它是否没有任何潜在的错误。无论如何,它现在工作正常。
  • 你可以在这里找到func X509KeyPair的实现。它在循环中解码 certPEMBlock。我不知道为什么。你能不能告诉我?非常感谢。 :)

标签: go openssl ssl-certificate x509


【解决方案1】:

这是我的解决方案,

仅供参考。

func getCustomExtensions(serverCertFile string, customOIDPrefix string) ([]pkix.Extension, bool) {
    certBytes, err := os.ReadFile(serverCertFile)
    if err != nil {
        return nil, false
    }
    block, _ := pem.Decode(certBytes)
    if block.Type == "CERTIFICATE" {
        certificate, err := x509.ParseCertificate(block.Bytes)
        if err != nil {
            return nil, false
        }
        var extensions []pkix.Extension
        for _, ext := range certificate.Extensions {
            // filter the custom extensions by customOID
            if strings.Contains(ext.Id.String(), customOIDPrefix) {
                extensions = append(extensions, ext)
            }
        }
        return extensions, true
    }

    return nil, false
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多