我可以使用以下代码访问 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
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)
获取扩展程序中存储的值。