2014-01-06 88 views
5

我正在开发一家jnlp文件用于启动基于swing的基于java的应用程序的公司。它有大量的jar被下载到客户端的jvm缓存中。当我将JVM更新到其目前最新的版本(版本1.7.0_45-B18)我开始看到下面当我尝试运行JNLP文件安全警告:签署jnlp以摆脱安全警告

Unknown publisher error

我看到这个错误后,读这篇文章从甲骨文网站签约JNLP文件(Signing JNLP files) 后来我加入三件事项目:

  1. 一个JNLP-INF文件夹包括APPLICATION.JNLP文件到我所有的罐子前第三方认证。
  2. 使用我自己的公司的数字证书+密钥库捆绑签名所有这些罐子
  3. 通过java控制面板将数字证书导入到我信任的jvm证书中。

我做了更改后上方,并试图新的罐子部署后运行JNLP文件我从JVM以下安全警告消息:

known publisher but still jnlp not signed error

正如你可以看到安全警告的严重性级别更改为更受欢迎的级别,现在发布者的名称不是未知的。它是证书中的名称。即使警告级别降低,它仍然是一个警告,我不希望我的最终用户每次都看到这一点。我怎么解决这个问题?

  1. 我是否应该尝试签署所有第三部分罐子?如果是这样,我怎么能用Ant命令来做到这一点?我如何提取第三方jar并添加JNLP-INF文件夹,然后使用Ant将其重新打包为jar?
  2. 我是否还应该签署最终的myapplication .ear文件,其中包含JNLP-INF子文件夹。此ear文件是否部署到jboss服务器?
  3. 我应该在罐子里的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" /> 

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

+0

所以要检查。所有罐子,*包括第三部分罐子,*都在贵公司的证书上进行了数字签名?如果不是,它会解释*“部分应用程序缺少数字签名”*消息。 –

+0

是的,所有jnlp中列出的罐子都被签名。但只有非第三方的内部有JNLP-INF/APPLICATION.JNLP子文件夹。这会导致问题吗? –

+2

AFAIU只有主Jar需要签名的JNLP。顺便说一句 - 请务必使用[JaNeLA](http://pscode.org/janela/)检查JNLP。顺便一提。由于'java-vm-args',这个JNLP似乎需要签名,但是要认识到大多数与内存相关的选项都可以用某种方式指定,以便JNLP不需要签名。您可以尝试使用它们来查看它是否适用于您的应用。 –

回答

4

这JNLP似乎需要,因为java-vm-args签约,但意识到大多数的内存相关的选项可以在某种程度上,这样的JNLP不需要签名指定。我建议你尝试这种方式。

+0

谢谢@Andrew Thompson。这解决了安全警告,现在openin屏幕是[that](http://imageshack.com/a/img15/5433/2n9o.png) –

3

我相信你会得到这个警告,因为你要求JNLP以完全的权限运行,并且用户需要知道这一点。

如果您的应用程序并不需要访问关键资源(如写入到硬盘驱动器),您可以通过更换运行在沙盒模式应用程序如下:

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

通过

<security> 
    <sandbox /> 
</security> 

如记录在http://docs.oracle.com/javase/7/docs/technotes/guides/jweb/security/manifest.html

您还可以将其作为沙盒是默认值将其删除。

+0

删除部分后,默认情况下会阻止该应用程序,如文档中所述_如果Java控制面板中的安全级别滑块设置为非常高,则需要使用权限属性。如果它不存在,则RIA被阻止。另外,当我将更改为时,没有任何更改。 –

+0

然后对不起,我完全错了:/ FYI我有一个Java Web Start应用程序,我不签署JNLP并且不会收到此警告。 – foch

+0

@alikerimerkan在jar清单中需要'Permissions'属性,它在JNLP中不是必需的,并且默认为'sandbox'。但jar清单和JNLP中的值必须相同。 –