jarsigner: этот jar содержит записи, цепочка сертификатов которых не проверена
Я пытаюсь подписать код файла JAR и использую JDK 1.7u1. Мы приобрели сертификат подписи кода GoDaddy, и я следовал инструкциям (подход 1) здесь:http://help.godaddy.com/article/4780
JAR подписывает штраф, однако всякий раз, когда я пытаюсь запустить команду:
jarsigner -verify
на моей подписанной банке с помощью JDK 1.7u1 я получаю следующий вывод:
s 180 Mon Dec 05 10:24:32 EST 2011 META-INF/MANIFEST.MF
[entry was signed on 12/5/11 10:24 AM]
X.509, CN=Removed Company Name, O=Removed Company Name, L=Removed City, ST=Removed State, C=US
[certificate is valid from 12/2/11 4:30 PM to 12/2/13 4:30 PM]
X.509, SERIALNUMBER=00000000, CN=Go Daddy Secure Certification Authority, OU=http://certificates.godaddy.com/repository, O="GoDaddy.com, Inc.", L=Scottsdale, ST=Arizona, C=US
[certificate is valid from 11/15/06 8:54 PM to 11/15/26 8:54 PM]
X.509, OU=Go Daddy Class 2 Certification Authority, O="The Go Daddy Group, Inc.", C=US
[certificate is valid from 6/29/04 1:06 PM to 6/29/34 1:06 PM]
[CertPath not validated: null]
342 Mon Dec 05 10:24:34 EST 2011 META-INF/JAVACSC.SF
6180 Mon Dec 05 10:24:34 EST 2011 META-INF/JAVACSC.RSA
0 Mon Dec 05 10:24:30 EST 2011 META-INF/
sm 2161 Wed Nov 30 10:23:20 EST 2011 C:/Users/Seth/Desktop/JAR/RunAppSF.class
[entry was signed on 12/5/11 10:24 AM]
X.509, CN=Removed Company Name, O=Removed Company Name, L=Removed City, ST=Removed State, C=US
[certificate is valid from 12/2/11 4:30 PM to 12/2/13 4:30 PM]
X.509, SERIALNUMBER=00000000, CN=Go Daddy Secure Certification Authority, OU=http://certificates.godaddy.com/repository, O="GoDaddy.com, Inc.", L=Scottsdale, ST=Arizona, C=US
[certificate is valid from 11/15/06 8:54 PM to 11/15/26 8:54 PM]
X.509, OU=Go Daddy Class 2 Certification Authority, O="The Go Daddy Group, Inc.", C=US
[certificate is valid from 6/29/04 1:06 PM to 6/29/34 1:06 PM]
[CertPath not validated: null]
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 certificate chain is not validated.
Я также попробовал jarsigner -verify
команда, используя ту же банку, что и выше на JDK 1.6u26 и 1.6u14 и это вернулся в полном порядке. (Выход из 1.6u26).
180 Mon Dec 05 10:24:32 EST 2011 META-INF/MANIFEST.MF
342 Mon Dec 05 10:24:34 EST 2011 META-INF/JAVACSC.SF
6180 Mon Dec 05 10:24:34 EST 2011 META-INF/JAVACSC.RSA
0 Mon Dec 05 10:24:30 EST 2011 META-INF/
sm 2161 Wed Nov 30 10:23:20 EST 2011 C:/Users/Seth/Desktop/JAR/RunAppSF.class
[entry was signed on 12/5/11 10:24 AM]
X.509, CN=Removed Company Name, O=Removed Company Name, L=Removed City, ST=Removed State, C=US
[certificate is valid from 12/2/11 4:30 PM to 12/2/13 4:30 PM]
X.509, SERIALNUMBER=00000000, CN=Go Daddy Secure Certification Authority, OU=http://certificates.godaddy.com/repository, O="GoDaddy.com, Inc.", L=Scottsdale, ST=Arizona, C=US
[certificate is valid from 11/15/06 8:54 PM to 11/15/26 8:54 PM]
[KeyUsage extension does not support code signing]
X.509, OU=Go Daddy Class 2 Certification Authority, O="The Go Daddy Group, Inc.", C=US
[certificate is valid from 6/29/04 1:06 PM to 6/29/34 1:06 PM]
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.
я пропустил дополнительный шаг, который мне нужно сделать, чтобы правильно подписать банку для JDK 1.7?
8 ответов
вы не отсутствует что-нибудь, и вы определенно не наедине с этой проблемой. После борьбы почти 12 часов я понял, что корень проблемы заключается в смешивании двоичных файлов из JDK 1.7
со старой версией Java, такие как JRE-1.6
. Точнее,keytool
входит JRE
, а JDK
корабли с keytool
и jarsigner
.
Итак, чтобы решить проблему, я полностью удалил JDK-1.7
из моей системы и установлен JDK-1.6 Update 30
. Теперь, если бы я мог ... --9--> это произведет jar verified
без какого-либо предупреждения, которое я считаю, что это то, что вы ожидаете.
У меня была такая же проблема, и если это может помочь другим, проблема заключается в том, как jarsigner находит хранилище ключей.
чтобы исправить проблему, сделайте:
jarsigner -verify -keystore xxxx.jks mysignedjar.jar
Это просто предупреждение можно игнорировать.
Если вы действительно не хотите игнорировать его, то скажите jarsigner, где находится ваше хранилище ключей, когда вы проверяете.
jarsigner -verbose -verify -keystore ${KEYSTORE_PATH} ${YOUR_JAR_FILE}
Это просто новая функция в JDK 7.
у меня была аналогичная проблема с "DigiCert SHA2 заверил ID Code Signing CA". Все версии oracle java, а также OpenJDK вели себя одинаково. Поддержка Digicert перенаправила меня на эту страницу, но ничто из сказанного здесь не помогло мне в процессе проверки.
Я пытаюсь подписать апплет, поэтому мне нужно, чтобы он был проверяемым также в браузере, поэтому трюк с предоставлением пути хранилища ключей к jarsigner-verify неприменим.
основная проблема, похоже, ошибка в keytool при работе с сертификатами, использующими SHA2 вместо SHA1, потому что тот же список шагов, примененных к сертификатам SHA1, всегда работает и никогда не работал для SHA2 для меня. Мне кажется, что keytool не способен обнаруживать "цепочку" сертификатов, импортированных в jks, и, таким образом, jarsigner не вставляет правильную цепочку сертификатов в подписанную банку, есть только окончательный сертификат, хранящийся в META-INF/myalias.ОГА файл вместо (проверяемые в OpenSSL pkcs7 в -в Алиас.RSA-print_certs -информ-дер -вне корпуса.ЭЛТ.)
Digicert предложил"...иногда мы видим проблемы с корнем, который на самом деле не импортируется правильно или полностью в первый раз, но запуск команды импорта, которая снова указывает на корень, может исправить это", даже это не помогло в моем случае.
поскольку нет возможности явно сказать keytool, какие сертификаты будут в цепочке, я решил построить цепочку с помощью openssl и импортировать ее как это:
cat TrustedRoot.pem DigiCertCA2.pem my.crt >chain
openssl pkcs12 -nodes -export -in my.crt -inkey my.key -out tmp.p12 -name myalias -certfile chain
keytool -importkeystore -destkeystore mykeystore.jks -srckeystore tmp.p12 -srcstoretype PKCS12
после этого mykeystore.JKS, похоже, содержит только мой сертификат, а не DigiCertCA2 или корень, когда он указан командой keytool-list, но с -v (verbose) он раскрывает глубину цепочки и ее сертификаты:
~/$ keytool --list --keystore mykeystore.jks -v|grep -e chain -e Certificate\[
Enter keystore password: 123456
Certificate chain length: 3
Certificate[1]:
Certificate[2]:
Certificate[3]:
и это то, что jarsigned должен подписать банку правильно, т. е. внедрить правильную цепочку сертификатов и сделать jar проверяемым также для конечного пользователя браузера.
Я обнаружил, что сообщение "эта банка содержит записи, цепочка сертификатов которых не проверена" также печатается, если вы подписываете файл Jar с помощью jre 1.7.0_21 и проверяете его с более низкой версией jre 1.7.0.
вывод: нет необходимости переходить на Java 1.6, просто используйте ту же версию jarsigner для подписания и проверки.
Это механизм безопасности в JDK 7+. Это печатает предупреждение при подписании банок без метки времени, которая может быть передана с флагом a-tsa. Если jar не имеет метки времени, он перестанет работать после даты его действия.
Если вы создаете цель Android, это предупреждение всегда будет печатать, если вы используете JDK новее 1.7.0_51. Android обычно рекомендует пройти 30 лет действия, поэтому это предупреждение может быть 100% проигнорировано, если вы бизнес-план, чтобы позволить пользователям использовать тот же.APK в 2046.
вот билет для этой функции, цель состоит в том, чтобы поощрять timestamping, который, я считаю, будет эффективным. http://bugs.java.com/view_bug.do?bug_id=8023338.
Если ваши сертификаты от Entrust, убедитесь, что вы используете более новый корневой сертификат.
http://www.entrust.net/knowledge-base/technote.cfm?tn=7875
:появляется сообщение об ошибке с указанием сертификата SLL проверка не удалась из-за отсутствия поля Основные Ограничения.
устранение:
в 2009 году доверить повторно выпущенный корневой сертификат 2048-bit включать поле Основные Ограничения (cn=Entrust.net сертификационный орган (2048), действительны до 7/24/2029). Entrust перестал выталкивать оригинальный 2048-битный корень через корневые обновления в Windows и Java (начиная с версии 1.6 update 22). Обновленный корневой сертификат с основными ограничениями можно ознакомиться здесь:
https://www.entrust.net/downloads/binary/entrust_2048_ca.cer
при создании / экспорте сертификата в p12 (используемый jarsigner) убедитесь, что выбрано следующее (например, если вы экспортируете с помощью мастера Internet explorer), вам нужно будет выбрать следующее в Мастере экспорта.
"экспорт закрытого ключа" "Включить все сертификаты в путь сертификации, если это возможно" "Экспортировать все расширенные свойства", отмеченные в опции .PFX или PKCS #12.
Если вы создадите p12 правильно в первом место тогда jarsign не требует особых усилий.