使用Java对PDF加密并数字签名时,Eclipse运行正常但可执行Jar包报错求助
解决iTextPDF导出Jar后
NoSuchAlgorithmException: 1.2.840.113549.3.2 KeyGenerator问题 嘿,这个问题我之前帮朋友排查过,刚好能给你点实用的建议!你遇到的这个异常对应的OID是RC2加密算法的密钥生成器,Eclipse里跑正常但Jar包报错,核心原因基本都是运行环境的加密支持差异或者打包时漏了东西,咱们一步步来解决:
先搞懂为啥会报错
- JDK和JRE的加密政策不一样:Eclipse默认用JDK跑,JDK自带的加密政策文件是完整版的,支持RC2这类算法;但你导出Jar后如果用普通JRE运行,默认的JRE可能只装了限制版的加密政策,直接就把RC2给禁了。
- 打包时漏了依赖库:如果你的项目用了BouncyCastle这类第三方加密库,导出Jar时没把它们一起打包进去,自然找不到对应的算法实现。
- 旧版iText的兼容性坑:有些老版本的iText在处理PDF公钥加密时,对JRE的加密环境要求比较苛刻,容易出环境适配问题。
一步步解决问题
1. 给JRE换上无限制加密政策文件
这是最常见的解决办法:
- 去OpenJDK或者Oracle的官方渠道下载无限制强度的加密政策包(Unlimited Strength Jurisdiction Policy Files)。
- 找到你用来运行Jar的JRE目录,进入
lib/security文件夹,把里面的local_policy.jar和US_export_policy.jar换成刚下载的完整版。 - 重启Jar程序试试,大概率能解决。
2. 打包时别漏了依赖库
如果你的项目依赖了BouncyCastle这类加密库:
- 在Eclipse导出可运行Jar的时候,选**"Package required libraries into generated JAR"或者"Copy required libraries into a sub-folder next to the generated JAR"**,确保依赖的加密库被一起打包或者放在Jar旁边能被找到的地方。
- 要是用Maven/Gradle构建的话,记得在配置文件里把依赖加好,比如Maven的pom.xml里加:
<dependency> <groupId>org.bouncycastle</groupId> <artifactId>bcprov-jdk15on</artifactId> <version>1.70</version> </dependency>
3. 代码里显式指定加密提供商
有时候JRE默认的提供商不支持RC2,咱们直接指定用BouncyCastle就行:
// 在初始化加密逻辑前,先添加BouncyCastle提供商 Security.addProvider(new BouncyCastleProvider()); // 设置加密的时候,把提供商指定为"BC" pdfStamper.setEncryption(..., ..., ..., PdfWriter.ENCRYPTION_AES_256, "BC");
4. 升级iText到新版本
如果你用的是iText 5.x这类老版本,建议升级到最新的稳定版(注意iText 7和5.x的API不太一样,需要稍微调整代码),新版本修复了不少环境相关的bug,对加密算法的支持也更完善。
验证一下
- 先在本地用JRE直接运行Jar,看看还会不会报错;
- 换了加密政策文件后正常的话,就是JRE的限制问题;
- 要是还不行,就检查依赖库有没有打包进去,或者试试显式指定加密提供商。
内容的提问来源于stack exchange,提问作者user1537156
相关产品推荐
相关产品推荐

