Java Applet遇access denied(java.lang.RuntimePermission setSecurityManager)问题
老旧Java Applet在Java 1.8环境下的权限问题解决方案
项目环境与配置
依赖配置
<dependency> <groupId>com.al6</groupId> <artifactId>rxtx</artifactId> <version>2.1.7</version> </dependency> <dependency> <groupId>java</groupId> <artifactId>plugin</artifactId> <version>1.6.12</version> </dependency>
项目lib目录文件
- RXTXcomm.jar
- RXTXcomm.jar.sig
- rxtxParallel.dll
- rxtxSerial.dll
Jar签名配置
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-jar-plugin</artifactId> <executions> <execution> <goals> <goal>sign</goal> </goals> </execution> </executions> <configuration> <keystore>.keyticket</keystore> <alias>ticket</alias> <storepass>ticket</storepass> <keypass>katana</keypass> <!-- signedjar>${project.build.directory}/signed/${project.build.finalName}.jar</signedjar --> <verify>false</verify> </configuration> </plugin>
编译版本兼容设置
为解决Java 1.8编译时的major.minor版本错误,在pom.xml中添加:
<configuration> <source>1.6</source> <target>1.6</target> <encoding>UTF-8</encoding> </configuration>
问题现象
项目在Java 1.6环境编译运行正常,切换到Java 1.8服务器后,先出现依赖库的major.minor版本错误,设置上述编译参数后编译通过,但运行时抛出access denied (java.lang.RuntimePermission setSecurityManager)异常。尝试修改编译机的java.security文件兼容旧签名流程,Jar显示已签名,但问题仍未解决。
解决方案
- 重新生成兼容Java 1.8的签名证书
Java 1.8默认禁用MD5withRSA等旧签名算法,旧证书即使修改安全配置也可能不被认可。用keytool生成符合要求的新证书:
keytool -genkeypair -alias newticket -keyalg RSA -keysize 2048 -sigalg SHA256withRSA -keystore new.keyticket -validity 3650
更新maven-jar-plugin配置,替换为新的keystore、别名和密码。
- 重新签名第三方依赖Jar
项目中的RXTXcomm.jar附带的旧签名文件无法被Java 1.8识别,用新证书重新签名:
jarsigner -keystore new.keyticket -sigalg SHA256withRSA -digestalg SHA-256 RXTXcomm.jar newticket
替换lib目录中的旧签名文件,或直接删除.sig文件(jarsigner会在Jar内部生成新签名信息)。
- 补充安全策略文件
如果必须保留旧签名,除修改java.security外,需添加自定义安全策略:
创建applet.policy文件:
grant signedBy "ticket" { permission java.lang.RuntimePermission "setSecurityManager"; permission java.io.FilePermission "<<ALL FILES>>", "read,write,execute"; // 根据Applet实际需求添加其他权限 };
运行时指定策略文件:
java -Djava.security.policy=applet.policy -jar your-applet.jar
- 修正签名插件配置
原配置中注释了signedjar参数,可能导致签名后的Jar未替换原Jar,取消注释并确保路径正确:
<signedjar>${project.build.directory}/signed/${project.build.finalName}.jar</signedjar>
运行时务必使用签名后的Jar文件。
- 重构代码移除不必要的SecurityManager调用
Java 1.8对SecurityManager的限制大幅收紧,若业务允许,直接移除setSecurityManager调用,从根源避免权限问题。
内容的提问来源于stack exchange,提问作者user2178964
相关产品推荐
相关产品推荐

