Как заставить jarsign подписывать jarfiles? - PullRequest
4 голосов
/ 10 июня 2009

Наш продукт остановлен на Java версии 1.5.0_13, и мы хотели бы обновить его. Наше программное обеспечение развертывает большое количество банок через Java Web Start; все эти банки должны быть подписаны. Однако некоторые из jar-файлов не содержат файлов классов, и, начиная с версии Java 1.5.0_14, утилита jarsign предпочитает не подписывать jar-файл, не содержащий файлов классов.

Что я могу сделать, чтобы jarsign подписал эти банки? Или что я могу сделать, чтобы распространять эти файлы через Java Web Start, не подписывая их? И есть ли где-нибудь, где это изменение в jarsign с версиями 1.5.0_14 и выше задокументировано? Я не могу найти его в заметках о выпуске .

Ответы [ 6 ]

9 голосов
/ 16 июля 2009

Я не могу проверить, есть ли проблема. Можете ли вы просмотреть и увидеть, что может отличаться в вашей среде? Я работаю на 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

Давайте сделаем банку:

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%)

Давайте подпишем банку: я использую самоподписанный сертификат.

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

Warning: The signer certificate will expire within six months.

Давайте посмотрим, что находится в нашей подписанной банке:

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

Хорошо, похоже, что оно подписано, и у него нет классов. Давайте посмотрим на содержимое 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=

Теперь давайте проверим банку:

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.

На первый взгляд все в порядке. Можете ли вы проверить, не истек ли срок действия ваших сертификатов или их отозвали? Вы используете самозаверяющие сертификаты или настоящие сертификаты? Или я неправильно понял, в чем ваша проблема?

2 голосов
/ 03 сентября 2009

Для тех, кто ищет эту проблему, мы определили, что она влияет только на некоторые более поздние версии Java 1.5, начиная с 1.5.0_14 и далее. Похоже, что это исправлено в последних версиях 1.5, и определенно исправлено в 1.6.

1 голос
/ 20 июля 2009

Добавление об этом: я использую Java Web Start, и у меня есть jar, который содержит только изображения. С JDK 1.6_05 (тоже 07, 10) и поколением Ant он подписывается без проблем (с самозаверяющим сертификатом). Так что, как и другие описанные, похоже, что он не связан с флягой, содержащей файлы .class или нет.

1 голос
/ 18 июля 2009

Кстати, я попробовал то же самое, что и Vinay, но с jarsigner JDK 1.5.0_17 и соответствующим сертификатом Verisign, и получил те же результаты. Jarsigner сработал, и банку подтвердили с помощью jarsigner -verify.

1 голос
/ 15 июля 2009

Это длинный выстрел, но задача Ant SignJar может убедить jarsign поступить правильно. Там есть множество вариантов, которые могут изменить баланс.

1 голос
/ 10 июня 2009

Вы можете поместить файлы фиктивных классов, если вам нужно. Возможно, неприятно, но, возможно, необходимо.

...