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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 17:38:09