我目前正在开发在JRE 1.8.0.77下运行的旧版JavaFX应用程序。它是在没有Internet连接的封闭网络中运行的。该应用程序通过Webstart部署到数百台计算机上,由于计算机经常被重新映像,因此我们希望避免用户单击安全弹出窗口。
jnlp具有标签:
<security>
<all-permissions/>
</security>
Oracle列出了实现此目的的两种主要方法,除了在“不再向我展示”框中打钩:
可以将证书手动导入到JRE可信证书存储中。
在$ {user.home} /。java.policy的Java策略文件中授予AllPermissions,或指向$(JRE_HOME)/lib/security/java.security文件中具有AllPermissions的任何Java策略文件。
Source
至此,我已经尝试了两种方法,但是面临以下问题:
授予所有权限
这是我首选的完成方法,因为应用程序在封闭的网络中运行,并且安全风险较小。但是我尝试添加以下文本:
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中的密钥库中,而不是$ USER_HOME中/.keystore或$ JAVA_HOME / jre / lib / security。
使用here所述的“ deployment.user.security.trusted.certs”,我可以让Webstart使用我提供的密钥库。 (要特别注意的是,当webstart创建自己的密钥库时,密码为“”。显然,此信息很难找到)
然后,手动批准的证书将获得以下别名,对于在以后的运行中正确识别它,这似乎是必需的:
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生成的确切密钥库分发给用户计算机。然后,我必须对从其他位置获取jnlp的每个位置重复此过程。
我希望有人知道其他解决方案或在我的故事中发现错误,因为看来我们将不得不指示用户单击该框。在此先感谢您提供任何提示!
最佳答案
该博客最能描述解决方案:
http://symplik.blogspot.com/2013/11/get-rid-of-java-applet-warning-when_3.html
为了使Webstart能够识别和使用证书,它必须在密钥库中至少具有以下别名:
deploymentusercert$tsflag
似乎没有必要使用随机数和URL。