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

Bouncy Castle升级后移除SignerInfos中的CMS算法保护属性

解决Bouncy Castle 1.58自动添加CMS算法保护属性的问题

你猜得没错,这个新增的1.2.840.113549.1.9.52属性就是问题所在——Bouncy Castle从1.5x版本开始默认启用了RFC 6211定义的算法保护属性,用来增强签名安全性,但很多旧系统或第三方对接方没兼容这个标准,就会导致拒收。

不用手动操作ASN.1结构,只需要在构建SignerInfoGenerator时加一行配置就能禁用这个自动属性:

修改后的完整代码

String signatureAlgorithm = "SHA512withRSA";
CMSSignedDataGenerator gen = new CMSSignedDataGenerator();
ContentSigner shaSigner = new JcaContentSignerBuilder(signatureAlgorithm).build(privateKey);

// 核心配置:禁用自动添加的算法保护属性
JcaSignerInfoGeneratorBuilder signerBuilder = new JcaSignerInfoGeneratorBuilder(
        new JcaDigestCalculatorProviderBuilder().build()
);
signerBuilder.setAlgorithmProtection(false);

gen.addSignerInfoGenerator(signerBuilder.build(shaSigner, certificate));
gen.addCertificate(new X509CertificateHolder(certificate.getEncoded()));

CMSTypedData processable = new CMSProcessableByteArray(toSign);
CMSSignedData signed = gen.generate(processable, true);

原理说明

  • Bouncy Castle的JcaSignerInfoGeneratorBuilder默认会自动生成算法保护属性(对应OID 1.2.840.113549.1.9.52),目的是防止签名算法和摘要算法被篡改。
  • 调用setAlgorithmProtection(false)会告诉BC不要生成这个属性,让新系统生成的CMS结构和BC 1.43版本完全一致,第三方系统就能正常接收了。
  • 这个设置不会影响其他默认签名属性(比如签名时间、内容摘要等),完全不影响原有功能。

修改后建议用OpenSSL再验证一次SignerInfos的signedAttrs,确认新增属性已经消失,再发给第三方测试。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 06:52:55