Java 21环境下如何限制JRE仅运行特定证书签名的JAR包?
Java 21 限制JRE仅运行特定签名JAR的可行方案
由于Java 21已完全移除Security Manager,以下是几种替代方案来实现严格的运行权限限制:
1. 自定义模块化运行时镜像(jlink)
- 使用
jlink构建仅包含应用依赖模块的最小化JRE,从根源减少可执行代码范围。 - 对镜像中的核心模块和允许运行的JAR用
jarsigner签名,启动JVM时添加参数--require-signed-modules=strict,强制所有加载的模块必须是已签名且被信任的。
2. 基于JPMS的签名模块强制依赖
- 在模块化JAR的
module-info.java中声明requires signed <信任的模块名>,确保应用仅能加载特定签名的依赖模块。 - 配合启动参数
--permit-illegal-access=deny,严格限制模块间的非法访问,进一步缩小权限范围。
3. 自定义安全策略文件
- 创建自定义安全策略文件(例如
restrictive.policy),仅授予特定签名代码权限:
// 仅允许TrustedAlias签名的代码拥有所有权限 grant signedBy "TrustedAlias" { permission java.security.AllPermission; }; // 拒绝所有其他代码的权限 grant { permission java.security.NoPermission; };
- 启动JVM时通过参数
-Djava.security.policy=restrictive.policy加载该策略,同时确保签名用的可信证书已导入JRE的cacerts信任存储(使用keytool -importcert命令完成导入)。
4. 容器化隔离(补充方案)
- 将JRE和允许运行的JAR打包进容器镜像,通过容器的权限控制(如只读文件系统、用户权限限制)进一步隔离运行环境,防止未授权代码被加载执行。
内容的提问来源于stack exchange,提问作者Torben
相关产品推荐
相关产品推荐

