使用Go解析CSR时Extensions返回空数组,如何获取challengePassword?
解决Go中从CSR获取challengePassword属性的问题
核心原因:
challengePassword是CSR的属性(Attribute),而非扩展(Extension),所以无法通过csr.Extensions获取。Go标准库crypto/x509解析CSR时,会将未识别的属性存入csr.UnrecognizedAttributes字段。解决步骤:
- 确认
challengePassword的OID为1.2.840.113549.1.9.7 - 遍历
csr.UnrecognizedAttributes,匹配目标OID - 对属性值进行ASN.1解码(该属性值通常为PrintableString或UTF8String类型)
- 确认
完整代码示例:
package main import ( "encoding/asn1" "encoding/pem" "crypto/x509" "fmt" "os" ) const challengePasswordOID = "1.2.840.113549.1.9.7" func main() { csrData, err := os.ReadFile("test.csr") if err != nil { panic(err) } block, _ := pem.Decode(csrData) if block == nil || block.Type != "CERTIFICATE REQUEST" { panic("无效的CSR PEM块") } csr, err := x509.ParseCertificateRequest(block.Bytes) if err != nil { panic(err) } for _, attr := range csr.UnrecognizedAttributes { if attr.Type.String() == challengePasswordOID { var password string if _, err := asn1.Unmarshal(attr.Value, &password); err == nil { fmt.Printf("获取到challengePassword: %s\n", password) } else { fmt.Printf("解析challengePassword失败: %v\n", err) } return } } fmt.Println("未找到challengePassword属性") }
- 补充说明:Go标准库仅解析预定义的标准扩展和属性,自定义或非标准属性都会被归类到
UnrecognizedAttributes,需要手动通过ASN.1编码规则解析其值。
内容的提问来源于stack exchange,提问作者Patrick H.
相关产品推荐
相关产品推荐

