You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Go解析CSR时Extensions返回空数组,如何获取challengePassword?

解决Go中从CSR获取challengePassword属性的问题
  • 核心原因:challengePassword是CSR的属性(Attribute),而非扩展(Extension),所以无法通过csr.Extensions获取。Go标准库crypto/x509解析CSR时,会将未识别的属性存入csr.UnrecognizedAttributes字段。

  • 解决步骤:

    1. 确认challengePassword的OID为1.2.840.113549.1.9.7
    2. 遍历csr.UnrecognizedAttributes,匹配目标OID
    3. 对属性值进行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.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 16:02:03