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默认会自动生成算法保护属性(对应OID1.2.840.113549.1.9.52),目的是防止签名算法和摘要算法被篡改。 - 调用
setAlgorithmProtection(false)会告诉BC不要生成这个属性,让新系统生成的CMS结构和BC 1.43版本完全一致,第三方系统就能正常接收了。 - 这个设置不会影响其他默认签名属性(比如签名时间、内容摘要等),完全不影响原有功能。
修改后建议用OpenSSL再验证一次SignerInfos的signedAttrs,确认新增属性已经消失,再发给第三方测试。
内容的提问来源于stack exchange,提问作者AragornSG
相关产品推荐
相关产品推荐

