从 golang 中的 SAN 内部检索针对 OID 存储的值

问题描述 投票:0回答:1

我可以使用以下代码访问 get

subjectAltName

    for _, ext := range certificate.Extensions {
        if ext.Id.Equal(subjectAltNameOID) {
            var extensionData asn1.RawValue
            _, err := asn1.Unmarshal(ext.Value, &extensionData)
            if err != nil {
                log.Fatal(err)
            }

            // get value for OID "2.23.33.5.1.6"
            
            return
        }
    }

var subjectAltNameOID = []int{2, 5, 29, 17}

但是我现在如何从extensionData 检索数据?


        Extension SEQUENCE (2 elem)
          extnID OBJECT IDENTIFIER 2.5.29.17 subjectAltName (X.509 extension)
          extnValue OCTET STRING (79 byte) 304D06066781050501010C09585886868768686806F7765…
            SEQUENCE (8 elem)
              OBJECT IDENTIFIER 2.23.33.5.1.1
              UTF8String hello
              OBJECT IDENTIFIER 2.23.33.5.1.4
              UTF8String power
              OBJECT IDENTIFIER 2.23.33.5.1.5
              UTF8String Unknown
              OBJECT IDENTIFIER 2.23.33.5.1.6 
              UTF8String 1234
go asn.1
1个回答
0
投票

Golang 标准库包含一个未导出的函数 parseSANExtension,用于解析 SAN 扩展:

func parseSANExtension(der cryptobyte.String) (dnsNames, emailAddresses []string, ipAddresses []net.IP, uris []*url.URL, err error)

它还包含一个函数 marshalSANs,用于编组 SAN 扩展:

// marshalSANs marshals a list of addresses into a the contents of an X.509
// SubjectAlternativeName extension.
func marshalSANs(dnsNames, emailAddresses []string, ipAddresses []net.IP, uris []*url.URL) (derBytes []byte, err error)

您可以从标准库复制源代码。然后调用

parseSANExtension(ext.Value)
获取扩展程序中存储的值。

尝试这个演示:https://go.dev/play/p/ZkaVBIVp3GB

© www.soinside.com 2019 - 2024. All rights reserved.