我目前正在开发一个在 JRE 1.8.0.77 下运行的较旧的 JavaFX 应用程序。它在封闭网络内运行,没有互联网连接。该应用程序通过 Webstart 部署到数百台计算机,我们希望避免用户单击安全弹出窗口,因为计算机经常重新镜像。
jnlp 具有标签:
<security>
<all-permissions/>
</security>
除了勾选“不再显示”框之外,Oracle 列出了实现此目的的两种主要方法:
- 可以手动将证书导入到 JRE 受信任的证书存储中。
- 授予位于 ${user.home}/.java.policy 的 Java 策略文件中的 AllPermissions,或指向 $(JRE_HOME)/lib/security/java.security 文件中具有 AllPermissions 的任何 Java 策略文件。
目前我已经尝试了这两种方法,但面临以下问题:
授予所有权限
这是我完成此任务的首选方式,因为应用程序在封闭网络中运行并且安全风险较小。但是我尝试添加以下文本:
grant {
permission java.security.AllPermission;
};
前往多个地点,包括:
- $USER_HOME/.java.policy
- $JAVA_HOME/jre/lib/security/java.policy
- $JAVA_HOME/jre/lib/security/javaws.policy(在运行 webstart 时使用 -verbose 将其列为“-Djava.security.policy”)
- 我什至制作了一个自定义的policy.file,将其发布在用户主目录下,并通过here中指定的“deployment.system.security.policy”指向它。 .
似乎这些策略确实有效,因为当我删除权限时,例如,.java.policy webstart 将拒绝作为一个整体运行。
但是每次我启动 webstart 时,给定 jnlp 所在的 url,它都会显示安全弹出窗口。
导入证书
这似乎是一种正确的方法,但是我注意到的第一件事是,当您通过手动弹出窗口允许证书时,它会被放置在驻留在 $USER_HOME/.java/deployment/security 中的 keystore 中,而不是在 $USER_HOME/.keystore 或 $JAVA_HOME/jre/lib/security 中。
使用提到的“deployment.user.security.trusted.certs”here我可以让 webstart 使用我提供的 keystore 。 (额外说明一下,当 webstart 创建自己的 keystore 时,密码是“”。显然,此信息很难找到)
手动批准的证书随后会获得以下别名,这似乎是为了在后续运行中正确识别它所必需的:
deploymentusercert$tsflag$loc=http//webserver.com:80##jnlp:http//webserver.com:80##from:http//webserver.com:80java.util.random@530ea09d
其中 webserver.com 是 jnlp 位置的 URL。如果我没有在证书旁边提到这个别名,它似乎在后续运行中不会被识别,并显示另一个安全弹出窗口。手动导出和导入证书不会添加此别名,因此无法识别。
我可以使用这个确切的别名并将其分发到用户计算机上,但是这些用户计算机分布在多个位置,每个位置都托管自己的 jnlp 文件。这意味着我没有可以使用的通用别名。
结论
看来我可以避免出现此安全弹出窗口的唯一方法是手动批准证书,然后将 webstart 生成的确切 keystore 分发到用户计算机。然后我必须对从其他地方获取 jnlp 的每个单独位置重复此过程。
我希望有人知道不同的解决方案或在我的故事中发现错误,因为我们似乎必须指示用户单击该框。预先感谢您提供任何提示!
最佳答案
这篇博客最好地描述了解决方案: http://symplik.blogspot.com/2013/11/get-rid-of-java-applet-warning-when_3.html
为了让 Webstart 识别并使用证书, keystore 中必须至少具有以下别名:
deploymentusercert$tsflag
似乎不需要随机数和 URL。
关于Java (8) 网络启动 : avoiding security popups,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61823646/