【发布时间】:2019-10-06 20:16:47
【问题描述】:
最近,我们不得不将使用单一签名 Applet 的旧 Web 应用程序升级到 Java JRE 到 1.8.0_201。从那时起,在启动小程序时,“你想运行这个应用程序吗?”弹出窗口显示详细信息“此应用程序将以不受限制的访问权限运行,这可能会使您的计算机和个人信息面临风险。如果您信任上述位置和发布者,请运行此应用程序。”
根据this oracle 文章,这是因为清单不包含 Permissions 属性造成的。验证表明 MANIFEST.MF 确实包含该属性。
Manifest-Version: 1.0
Application-Name: MyApplet
Implementation-Title: My Applet
Svn-Url:
Job-Name:
Implementation-Version: 3.12.0-SNAPSHOT
Build-Number:
Archiver-Version: Plexus Archiver
Built-By: username
Implementation-Vendor-Id: nl.myorg.myapplet
Application-Library-Allowable-Codebase: *.myorg.nl
localhost
127.0.0.1
Implementation-Vendor: My Organisation
Build-Tag: 3.12.0-SNAPSHOT
Caller-Allowable-Codebase: *.myorg.nl localhost 127.0.0.1
Permissions: sandbox
Codebase: *.myorg.nl localhost 127.0.0.1
Svn-Revision-LastChange:
Created-By: Apache Maven 3.1.1
Build-Jdk: 1.8.0_171
Svn-Revision:
我认为这个问题与Java Applet & Web Start - Code Signing 有关。所以我尝试在沙箱中运行小程序,以防止向用户询问完全权限。
我将<Permissions>sandbox</Permissions> 条目添加到小程序清单中。
更改了小程序 jnlp 中的安全设置
<security>
<all-permissions/>
</security>
到
<security>
<j2ee-application-client-permissions />
</security>
并将<PARAM name=permissions value=sandbox> 添加到<applet></applet>。
进行这些更改后,将显示一个弹出窗口,并显示“ExitException:Java 安全设置已阻止此应用程序运行。您可以在 Java 控制面板中更改此行为。'。
Java 控制台确实提供了更多详细信息;
cache: Create from verifier: JarSigningData{hasOnlySignedEntries=true, hasSingleCodeSource=true, hasMissingSignedEntries=false}
java.lang.SecurityException: JAR manifest requested to run in sandbox only: http://localhost:8080/MyApplet/static/3.12.0-SNAPSHOT/applets/MyApplet.jar
at com.sun.deploy.security.DeployManifestChecker.verify(Unknown Source)
at com.sun.deploy.security.DeployManifestChecker.verify(Unknown Source)
at com.sun.javaws.security.AppPolicy.grantUnrestrictedAccess(Unknown Source)
at com.sun.javaws.security.JNLPSignedResourcesHelper.checkSignedResourcesHelper(Unknown Source)
at com.sun.javaws.security.JNLPSignedResourcesHelper.checkSignedResources(Unknown Source)
at sun.plugin2.applet.JNLP2Manager.prepareLaunchFile(Unknown Source)
at sun.plugin2.applet.JNLP2Manager.loadJarFiles(Unknown Source)
at sun.plugin2.applet.Plugin2Manager$AppletExecutionRunnable.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)
basic: The Java security settings have prevented this application from running. You may change this behavior in the Java Control Panel.
basic: Dialog type is not candidate for embedding
既然异常是由 DeployManifestChecker.verify 抛出的,是不是 jnlp 文件有错误?如果有怎么判断是什么问题?
【问题讨论】:
-
Java 放弃了沙盒。据我所知,在发生足够多的安全问题后,Oracle 决定忘记尝试保证沙箱的安全,而只是对所有内容显示警告。当然,在后来的 Java 版本中,applet 和 Java Web Start 已被弃用,它们即将被删除。
-
这也是我的看法,@VGR。 OP:虽然我觉得关于 applet 和 JNLP 有很多我不知道的地方,但我确实知道很多(包括成为这两者的顶级答案提供者并为 JNLP 文件创建了验证器) .我认为在这个时代追逐 applet / JNLP / web start 问题是浪费精力。他们快死了/死了。是时候转向其他技术了。
标签: java applet jnlp manifest.mf