2014-01-06 111 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中的值必須相同。 –