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

Java使用BouncyCastle生成带SAN的CSR时请求扩展缺失如何解决

问题根因
  • PKCS#10规范中pkcs_9_at_extensionRequest属性要求传入的是Extensions结构集合,不是直接传入单个扩展的原始内容序列。你当前代码直接将SAN的DER序列作为属性值传入,结构不匹配,openssl无法识别出扩展字段。
  • 你注释掉的addExtension方法是BouncyCastle封装好的正确扩展添加方式,不需要手动拼接属性结构。
修复代码示例
PKCS10CertificationRequestBuilder p10Builder = new JcaPKCS10CertificationRequestBuilder(
    new X500Principal("CN=clustername"), publicKey);

// 构造SAN扩展内容
ASN1Encodable[] subjectAlternativeNames2 = new ASN1Encodable[] {
        new GeneralName(GeneralName.rfc822Name, "clusteruid"),
        new GeneralName(GeneralName.dNSName, "127.0.0.1")
};
DERSequence subjectAlternativeNames = new DERSequence(subjectAlternativeNames2);
// 直接使用addExtension方法添加SAN扩展,第二个参数为是否是关键扩展
p10Builder.addExtension(Extension.subjectAlternativeName, false, subjectAlternativeNames);

JcaContentSignerBuilder csBuilder = new JcaContentSignerBuilder("MD5WithRSA");
ContentSigner signer = csBuilder.build(privateKey);
PKCS10CertificationRequest thecsr = p10Builder.build(signer);

// 输出CSR文件逻辑不变
out = new FileOutputStream(outFile + "x.csr");
out.write("-----BEGIN CERTIFICATE REQUEST-----\n".getBytes());
out.write(Base64.getEncoder().encodeToString(thecsr.getEncoded()).getBytes());
out.write("\n-----END CERTIFICATE REQUEST-----\n".getBytes());
out.close();
验证方法

执行原有校验命令即可看到预期的扩展输出:
openssl req -in /tmp/licensingx.csr -text -noout

额外提示:MD5WithRSA签名算法安全性较低,生产环境建议替换为SHA256WithRSA等更安全的签名算法。

内容的提问来源于stack exchange,提问作者mhollowaynj

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 06:54:03