为了消除安全警告,如何签署jnlp文件

6
我在一家公司开发,使用jnlp文件启动基于swing的web java应用程序。它有很多jar包被下载到客户端的jvm缓存中。当我将我的jvm更新到当前最新版本(构建1.7.0_45-b18)时,我尝试运行jnlp文件时看到了下面的安全警告:

Unknown publisher error

当我看到这个错误并阅读了来自Oracle网站的有关签署jnlp文件的文章(Signing JNLP files)后,我向项目中添加了三个内容:

  1. 一个JNLP-INF文件夹,包括除第三方文件之外的所有jar文件中的APPLICATION.JNLP文件。
  2. 使用我的公司的数字证书+密钥库捆绑包对所有这些jar文件进行签名。
  3. 通过Java控制面板将数字证书导入我的受信任CA证书中。

在进行了上述更改并在部署新的jar文件后尝试运行jnlp文件时,我从jvm收到了以下安全警告信息:

known publisher but still jnlp not signed error

正如您所看到的,安全警告的严重程度已经改变为更加友好的级别,并且现在发布者的名称不再是未知的。它是证书上的名称。即使警告级别降低了,它仍然是一种警告,我不希望我的最终用户每次都看到这个。我该如何解决这个问题?
  1. 我应该尝试签署所有第三方jar吗?如果是,我该如何使用Ant命令执行此操作?我该如何提取第三方jar并添加其中的JNLP-INF文件夹,然后使用Ant将其重新打包成jar文件?
  2. 我是否还应该使用JNLP-INF子文件夹对最终的myapplication.ear文件进行签名?该ear文件部署到jboss服务器上?
  3. 我是否应该在jar文件的META-INF/MANIFEST文件中添加一些额外的行?
  4. 我是否应该期望Oracle阻止我的应用程序在具有此警告级别的jvm上运行?

我的JNLP文件是这样的文本:

<?xml version="1.0" encoding="utf-8"?>
    <jnlp spec="1.0+" codebase="http://10.100.10.9/ikarusdelhitest/" href="ikarus.jnlp">
<information>
    <title>Ikarus</title>
    <vendor>My Company name</vendor>
    <homepage href="http://www.mycompanyname.com" />
    <description>My jnlp triggered web based enterprise software</description>
    <icon href="ikarus.ico" />
    <offline-allowed />
</information>
<security>
    <all-permissions />
</security>
<resources>
    <j2se version="1.6+" href="http://java.sun.com/products/autodl/j2se"
        java-vm-args="-Xnoclassgc -Xincgc -client -XX:DefaultMaxRAM=208M -Xms64M -Xmx256M -XX:PermSize=32M -XX:MaxPermSize=128M -XX:MinHeapFreeRatio=15 -XX:MaxHeapFreeRatio=50" />
    <jar href="jars/ikarus/ikarusClient.jar" />
    <jar href="jars/ikarus/ikarusDelegators.jar" />
    <jar href="jars/ikarus/clientRules.jar" />
    <jar href="jars/ikarus/ruleImps.jar" />
    <jar href="jars/ikarus/ikarusUtil.jar" />
    <jar href="jars/ikarus/ikarusResources.jar" />
    <jar href="jars/ikarus/domain.jar" />
    <jar href="jars/ikarus/domain_repository.jar" />
    <jar href="jars/ikarus/domain_service.jar" />
    <jar href="jars/ikarus/app_repository.jar" />
    <jar href="jars/ikarus/app_service.jar" />
    <jar href="jars/ikarus/infrastructure.jar" />
    <jar href="jars/ikarus/integration_domain.jar" />
    <jar href="jars/jboss_ejb_auth/ejb3-persistence.jar" />
    <jar href="jars/jboss_ejb_auth/jboss-ejb3x.jar" />
    <jar href="jars/jboss_ejb_auth/jbossall-client.jar" />
    <jar href="jars/jasper/commons-beanutils-1.8.0.jar" />
    <jar href="jars/jasper/commons-collections-3.2.1.jar" />
    <jar href="jars/jasper/commons-digester-1.7.jar" />
    <jar href="jars/jasper/commons-logging-1.1.jar" />
    <jar href="jars/jasper/iText-2.1.0.jar" />
    <jar href="jars/jasper/jasperreports-3.6.0.jar" />
    <jar href="jars/jasper/poi-3.2-FINAL-20081019.jar" />
    <property name="jnlp.localization" value="Delhi"/>
</resources>
<application-desc main-class="com.celebi.ikarus.main.Ikarus" />

感谢任何帮助/评论/头脑风暴。


那么只是检查一下。所有的Jars,包括第三方Jars,都使用贵公司的证书进行数字签名了吗?如果没有,这就可以解释为什么会出现“应用程序的某些部分缺少数字签名”的消息。 - Andrew Thompson
是的,jnlp中列出的所有jar文件都已签名。但只有非第三方的jar文件才有JNLP-INF/APPLICATION.JNLP子文件夹。这会导致问题吗? - ali kerim erkan
2
据我所知,只有主要的Jar文件需要签名的JNLP。顺便提一下 - 一定要使用JaNeLA检查JNLP。顺便说一下,这个JNLP似乎需要签名,因为它使用了java-vm-args,但请注意,大多数与内存相关的选项可以以一种不需要签署JNLP的方式指定。您可以尝试使用这些选项来查看是否适用于您的应用程序。 - Andrew Thompson
我没有一个包含其他文件的主要jar文件。我正在按照这里描述的方式签署JNLP文件:链接 - 我还有其他方法可以尝试签署我的jar文件吗? - ali kerim erkan
“我没有一个包含其他文件的主要jar文件。” 嗯...是的,好吧。从JNLP中显示的Jar列表中,这就是我所假设的。我还提到:“您可以尝试使用它们来查看是否适用于您的应用程序。” 如果您感觉不舒服,请原谅我的假设,但是当您回复类似于“有没有其他方法可以尝试签署我的jar?”时,似乎您正在忽略我。由于我们的沟通显然出现了问题,我怀疑我无法再提供更多帮助。抱歉。 - Andrew Thompson
显示剩余6条评论
2个回答

5

这个JNLP似乎需要签名,因为它有java-vm-args,但是请注意,大多数内存相关的选项可以以一种方式指定,使得JNLP不需要签名。我建议您尝试那种方式。

编辑

JNLP是Java插件的一部分,在Java 9左右被Oracle删除并弃用。请使用其他方法启动应用程序。


1
感谢@Andrew Thompson。这解决了安全警告问题,现在开屏界面是这样的 - ali kerim erkan

3

我认为您收到此警告是因为您正在请求使用完全权限运行JNLP,用户需要了解其中的情况。

如果您的应用程序不需要访问重要资源(例如写入硬盘),您可以通过以下方式将应用程序运行在沙箱模式下:

<security>
    <all-permissions />
</security>

by

<security>
    <sandbox />
</security>

根据http://docs.oracle.com/javase/7/docs/technotes/guides/jweb/security/manifest.html的记录,由于sandbox是默认值,您也可以将其移除。

移除<security>部分后,应用程序默认被阻止,正如文档中所述:“如果Java控制面板中的安全级别滑块设置为非常高,则需要权限属性。如果不存在,则RIA将被阻止。”此外,当我将<all-permissions />更改为<sandbox />时,没有任何变化。 - ali kerim erkan
那么抱歉,我完全错了 :/ 顺便说一下,我有一个 Java Web Start 应用程序,我没有签署 JNLP,也没有收到这个警告。 - foch
@alikerimerkan Permissions 属性在 jar 清单中是必需的,但在 JNLP 中不是必需的,并且默认为 sandbox。但是,在 jar 清单和 JNLP 中的值必须相同。 - Alexey Ivanov

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接