2009-06-10 46 views
4

我們的產品在Java 1.5.0_13版暫停,我們想升級。我們的軟件通過Java Web Start部署了大量的jar包;所有這些罐子都必須簽名。但是,一些jar文件不包含類文件,並且從Java版本1.5.0_14開始,似乎jarsign實用程序選擇不簽署任何不包含類文件的jar。如何強制jarsign簽署jarfiles?

我能做些什麼來強制jarsign簽署這些罐子?或者,我能做些什麼來通過Java Web Start分發這些jar而不簽署它們?是否有任何地方記錄了對版本1.5.0_14及更高版本的jarsign變更?我在release notes找不到它。

+1

你能顯示你用來創建簽名的jar文件的命令嗎? – notnoop 2009-07-18 17:47:50

回答

9

我無法驗證是否有任何問題。你可以看看你的環境中可能會有什麼不同嗎?我在Windows 7 RC上運行。

讓我們檢查版本:

 
C:\temp>java -version 
java version "1.5.0_14" 
Java(TM) 2 Runtime Environment, Standard Edition (build 1.5.0_14-b03) 
Java HotSpot(TM) Client VM (build 1.5.0_14-b03, mixed mode, sharing) 

讓我們看看會在我們的罐子:

 
C:\temp>dir /s /b com 
C:\temp\com\rdc 
C:\temp\com\rdc\test 
C:\temp\com\rdc\test\logging.properties 

讓我們的jar:

 
C:\temp>jar -cfv test-source.jar com/* 
added manifest 
adding: com/rdc/(in = 0) (out= 0)(stored 0%) 
adding: com/rdc/test/(in = 0) (out= 0)(stored 0%) 
adding: com/rdc/test/logging.properties(in = 13) (out= 15)(deflated -15%) 

讓我們簽署的jar:我正在使用自簽名證書。

 
C:\temp>jarsigner -signedjar test-dest.jar test-source.jar vinay 
Enter Passphrase for keystore: 

Warning: The signer certificate will expire within six months. 

讓我們來看看在我們的簽名的jar:

 
C:\temp>jar tvf test-dest.jar 
    155 Wed Jul 15 23:39:12 BST 2009 META-INF/MANIFEST.MF 
    276 Wed Jul 15 23:39:12 BST 2009 META-INF/VINAY.SF 
    1130 Wed Jul 15 23:39:12 BST 2009 META-INF/VINAY.DSA 
    0 Wed Jul 15 23:37:18 BST 2009 META-INF/ 
    0 Wed Jul 15 19:44:44 BST 2009 com/rdc/ 
    0 Wed Jul 15 19:44:58 BST 2009 com/rdc/test/ 
    13 Wed Jul 15 23:37:10 BST 2009 com/rdc/test/logging.properties 

OK,它肯定似乎已經簽署,且無類。讓我們來看看MANIFEST.MF內容:

 
Manifest-Version: 1.0 
Created-By: 1.5.0_14 (Sun Microsystems Inc.) 

Name: com/rdc/test/logging.properties 
SHA1-Digest: Ob/S+a7TLh+akYGEFIDugM12S88= 

VINAY.SF內容:

 
Signature-Version: 1.0 
Created-By: 1.5.0_14 (Sun Microsystems Inc.) 
SHA1-Digest-Manifest-Main-Attributes: 4bEkze9MHmgfBoY+fnoS1V9bRPs= 
SHA1-Digest-Manifest: YB8QKIAQPjEYh8PkuGA5G8pW3tw= 

Name: com/rdc/test/logging.properties 
SHA1-Digest: qXCyrUvUALII7SBNEq4R7G8lVQQ= 

現在,讓我們驗證jar:

 
C:\temp>jarsigner -verify -verbose test-dest.jar 

     155 Wed Jul 15 23:51:34 BST 2009 META-INF/MANIFEST.MF 
     276 Wed Jul 15 23:51:34 BST 2009 META-INF/VINAY.SF 
     1131 Wed Jul 15 23:51:34 BST 2009 META-INF/VINAY.DSA 
      0 Wed Jul 15 23:37:18 BST 2009 META-INF/ 
      0 Wed Jul 15 19:44:44 BST 2009 com/rdc/ 
      0 Wed Jul 15 19:44:58 BST 2009 com/rdc/test/ 
smk  13 Wed Jul 15 23:37:10 BST 2009 com/rdc/test/logging.properties 

    s = signature was verified 
    m = entry is listed in manifest 
    k = at least one certificate was found in keystore 
    i = at least one certificate was found in identity scope 

jar verified. 

Warning: This jar contains entries whose signer certificate will expire within 
six months. Re-run with the -verbose and -certs options for more details. 

在它的面前,似乎一切按順序排列。你能檢查你的證書是否過期,或被撤銷嗎?您是否使用自簽名證書或真正的證書?或者我誤解了你的問題是什麼?

1

如果需要,您可以放入虛擬類文件。可能令人厭惡,但也許是必要的。

+3

是的,我們發現了Hello World java應用的目的:) – akarnokd 2009-07-14 20:14:01

1

這是一個遠射,但螞蟻SignJar task也許能說服雅爾吉斯做正確的事情。那裏有一些選項可能會影響平衡。

1

順便說一句,我嘗試了與Vinay一樣的東西,但是使用JDK 1.5.0_17 jarsigner和合適的Verisign證書,並得到了相同的結果。 Jarsigner工作,罐子使用jarsigner -verify驗證。

1

添加關於它:我使用Java Web Start,並且我有一個只包含圖像的jar。 使用JDK 1.6_05(07,10)以及Ant代,它的簽名沒有問題(帶有自簽名證書)。 因此,像其他人所描述的那樣,它似乎沒有鏈接到包含.class文件的jar文件。

2

對於在這個問題上搜索的任何人,我認爲它隻影響某些更高版本的Java 1.5,從1.5.0_14開始。它在1.5的最新版本中似乎是固定的,並且在1.6中肯定是固定的。