【问题标题】:How to avoid applets "Do you want to run this application?" pop-up message如何避免小程序“你想运行这个应用程序吗?”弹出消息
【发布时间】: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>

并将&lt;PARAM name=permissions value=sandbox&gt; 添加到&lt;applet&gt;&lt;/applet&gt;

进行这些更改后,将显示一个弹出窗口,并显示“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


【解决方案1】:

解决方案是将小程序证书的公钥以一种非常特殊的方式存储到用户目录中的 javatrusted.certs 中。 trusted.certs 位于 \Users{username}\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 和 value 之间的分隔符是 '=' 和其他的 ':'。

唯一的问题是通过 Java 控制面板创建的密钥库没有密码。如果在添加小程序证书之前没有现有的trusted.certs,您将不得不编写一个小型Java 应用程序或使用除keytool 之外的其他工具来创建密钥库。这是因为 keytool 不允许您在没有密码的情况下创建密钥库。或者,您可以使用受密码保护的 java 信任库让世界更安全一点:-D。

【讨论】:

    猜你喜欢
    • 2010-12-26
    • 2017-02-16
    • 1970-01-01
    • 2012-12-11
    • 2021-10-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多