最近,对于使用单个签名Applet的旧Web应用程序,我们不得不将Java JRE升级到1.8.0_201。从那时起,在启动小程序时,“您是否要运行此应用程序?”弹出窗口显示详细信息:“此应用程序将以不受限制的访问权限运行,这可能会危及您的计算机和个人信息。如果您信任上面的位置和发布者,请运行此应用程序。”
根据this甲骨文的文章,这是由于清单不包含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有关。因此,我尝试在沙盒中运行该applet,以防止要求用户提供完整权限。
我在小程序清单中添加了<Permissions>sandbox</Permissions>
条目。
更改了applet 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文件中存在错误?如果是这样,如何确定出什么问题了?
答案 0 :(得分:0)
解决方案是通过以非常特定的方式将applet证书的公钥存储到用户目录中的java trust.certs中。 Trusted.certs位于\ Users {用户名} \ AppData \ LocalLow \ Sun \ Java \ Deployment \ security。
必须按照以下说明加载证书
"\Program Files\Java\jre1.8.0_201\bin\keytool.exe" -import -alias deploymentusercert$tsflag$loc=http//localhost:8080##jnlp:http//localhost:8080##docbase:http//localhost:8080##from:http//localhost:8080java.util.random@1dc6cb9 -file D:\Desktop\APP-CERT.csr -keystore trusted.certs
该别名似乎被误用于存储站点和jnlp的关联位置。别名的标题必须为“ deploymentusercert $ tsflag $”,并且必须以java.util.random作为尾部文本引用Java实例。在loc,jnlp,docbase和from属性之间必须指定,其中loc和值之间的分隔符为'=',其他则为':'。
唯一的问题是通过Java控制面板创建的密钥库没有密码。如果在添加小应用程序证书之前没有现有的trust.certs,则必须编写一个小型Java应用程序或使用除keytool之外的其他工具来创建密钥库。这是因为keytool不允许您创建没有密码的密钥库。或者,您可以使用受密码保护的Java truststore:-D使世界更加安全。