Bouncycastle加载加密私钥报InvalidAlgorithmParameterException(Java11)
问题产生原因
- JDK 9及以上版本调整了安全Provider的默认优先级,内置的SunJCE Provider优先级高于手动添加的BouncyCastle(BC)Provider。Java 8环境下BC Provider优先级更高,解密时默认调用BC的PBE算法实现,该实现会自动从PKCS8加密私钥结构中提取所需的盐、迭代次数等PBE参数,不需要额外传入。
- 你代码中的
JceOpenSSLPKCS8DecryptorProviderBuilder未显式指定Provider,Java 11环境下会优先调用SunJCE的PBEWithMD5AndDES算法实现(对应异常中的OID1.2.840.113549.1.5.3),而SunJCE的该实现要求必须显式传入PBE参数,否则就会抛出InvalidAlgorithmParameterException: Parameters missing异常。 - 你当前使用的BC 1.57版本发布时间较早,对Java 9+的模块化、Provider优先级适配存在缺陷,也会加剧该问题的出现。
修复方案
方案1(优先采用,改动最小)
显式给解密构造器指定使用BouncyCastle Provider,修改decryptorProvider构造代码即可:
// 原来的代码 // InputDecryptorProvider decryptorProvider = new JceOpenSSLPKCS8DecryptorProviderBuilder().build(password.toCharArray()); // 修改为下面的代码,指定使用BC Provider InputDecryptorProvider decryptorProvider = new JceOpenSSLPKCS8DecryptorProviderBuilder() .setProvider(BouncyCastleProvider.PROVIDER_NAME) .build(password.toCharArray());
如果修改后仍报错,可以调整BC Provider的插入优先级,将初始化Provider的代码改为:
// 将BC Provider插入到优先级第1位 Security.insertProviderAt(new BouncyCastleProvider(), 1);
方案2(适配高版本JDK建议)
升级BouncyCastle依赖版本到1.60及以上,新版本已经针对Java 9+的安全体系做了适配,避免Provider优先级导致的调用异常。
内容的提问来源于stack exchange,提问作者Jardo
相关产品推荐
相关产品推荐

