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 не требует особых усилий.