Как мне заставить jarsign подписывать jarfiles?
Вопрос
Наш продукт остановлен на Java версии 1.5.0_13, и мы хотели бы обновить его.Наше программное обеспечение развертывает большое количество jar-файлов через Java Web Start;все эти банки должны быть подписаны.Однако пара jar-файлов не содержат файлов классов, и, начиная с Java версии 1.5.0_14, похоже, что утилита jarsign предпочитает не подписывать любые jar-файлы, которые не содержат файлов классов.
Что я могу сделать, чтобы заставить jarsign подписать эти банки?Или что я могу сделать, чтобы распространять эти jar-файлы через Java Web Start без их подписи?И есть ли где-нибудь, где задокументировано это изменение jarsign с версиями 1.5.0_14 и выше?Я не могу найти это в примечания к выпуску.
Решение
Я не могу проверить, есть ли какая-либо проблема.Можете ли вы просмотреть и увидеть, что может измениться в вашем окружении?Я работаю на 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.
На первый взгляд кажется, что все в порядке.Можете ли вы проверить, истек ли срок действия ваших сертификатов или они были отозваны?Используете ли вы самоподписанные сертификаты или настоящие сертификаты?Или я неправильно понял, в чем ваша проблема?
Другие советы
Для всех, кто ищет по этой проблеме, мы определили, что это влияет только на некоторые более поздние версии Java 1.5, я полагаю, начиная с 1.5.0_14 и далее.Похоже, это исправлено в последних версиях 1.5 и определенно исправлено в 1.6.
Вы можете поместить туда файлы фиктивных классов, если вам нужно.Вероятно, неприятно, но, возможно, необходимо.
Кстати, я попробовал то же самое, что и Vinay, но с jarsigner JDK 1.5.0_17 и соответствующим сертификатом Verisign, и получил те же результаты.Jarsigner сработал, и jar прошел проверку с помощью jarsigner -verify .
Добавляя об этом :Я использую Java Web Start, и у меня есть jar, который содержит только изображения.С JDK 1.6_05 (07, 10 тоже) и Ant generation он подписывается без проблем (с самозаверяющим сертификатом).Итак, как и другие описанные, похоже, что он не связан с jar, содержащим файлы .class, или нет.
Это маловероятно, но Муравей Задача SignJar возможно, удастся убедить jarsign поступить правильно.Там есть куча вариантов, которые могут склонить чашу весов.