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

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显示已签名,但问题仍未解决。

解决方案

  1. 重新生成兼容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、别名和密码。

  1. 重新签名第三方依赖Jar
    项目中的RXTXcomm.jar附带的旧签名文件无法被Java 1.8识别,用新证书重新签名:
jarsigner -keystore new.keyticket -sigalg SHA256withRSA -digestalg SHA-256 RXTXcomm.jar newticket

替换lib目录中的旧签名文件,或直接删除.sig文件(jarsigner会在Jar内部生成新签名信息)。

  1. 补充安全策略文件
    如果必须保留旧签名,除修改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
  1. 修正签名插件配置
    原配置中注释了signedjar参数,可能导致签名后的Jar未替换原Jar,取消注释并确保路径正确:
<signedjar>${project.build.directory}/signed/${project.build.finalName}.jar</signedjar>

运行时务必使用签名后的Jar文件。

  1. 重构代码移除不必要的SecurityManager调用
    Java 1.8对SecurityManager的限制大幅收紧,若业务允许,直接移除setSecurityManager调用,从根源避免权限问题。

内容的提问来源于stack exchange,提问作者user2178964

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 06:20:36