Почему Java Web Start сообщает, что подписанный файл jar не подписан?

Java Web Start (JWS) сообщает, что не может запустить мое приложение, потому что файл jar не подписан:

Error: Unsigned application requesting unrestricted access to system
       Unsigned resource: .../dynaccn.jar

Но файл jar подписан:

$ jarsigner -keystore ... dynaccn.jar idv
$ jar tf dynaccn.jar
META-INF/MANIFEST.MF
META-INF/IDV.SF
META-INF/IDV.RSA
META-INF/
edu/
edu/ucar/
edu/ucar/unidata/
edu/ucar/unidata/dynaccn/
App$1.class
...
$ jarsigner -verbose -certs -verify dynaccn.jar
       28325 Tue Aug 17 09:41:58 MDT 2010 META-INF/MANIFEST.MF
       28404 Tue Aug 17 09:41:58 MDT 2010 META-INF/IDV.SF
        2880 Tue Aug 17 09:41:58 MDT 2010 META-INF/IDV.RSA
           0 Tue Aug 17 09:41:58 MDT 2010 META-INF/
           0 Mon Aug 16 10:10:34 MDT 2010 edu/
           0 Mon Aug 16 10:10:34 MDT 2010 edu/ucar/
           0 Mon Aug 16 10:10:34 MDT 2010 edu/ucar/unidata/
           0 Mon Aug 16 10:10:34 MDT 2010 edu/ucar/unidata/dynaccn/
...
sm       486 Mon Aug 16 10:10:34 MDT 2010 App$1.class

      X.509, CN=University Corporation for Atmospheric Research, OU=UNIDATA, O=University Corporation for Atmospheric Research, L=Boulder, ST=Colorado, C=US
      [certificate will expire on 2/6/11 4:59 PM]
      X.509, CN=Thawte Code Signing CA, O=Thawte Consulting (Pty) Ltd., C=ZA
      [certificate is valid from 8/5/03 6:00 PM to 8/5/13 5:59 PM]
      [KeyUsage extension does not support code signing]
      X.509, [email protected], CN=Thawte Premium Server CA, OU=Certification Services Division, O=Thawte Consulting cc, L=Cape Town, ST=Western Cape, C=ZA
      [certificate is valid from 7/31/96 6:00 PM to 12/31/20 4:59 PM]
      [CertPath not validated: null]
...
jar verified.

Warning: 
This jar contains entries whose signer certificate's KeyUsage extension doesn't allow code signing.
This jar contains entries whose signer certificate will expire within six months. 
This jar contains entries whose certificate chain is not validated.
This jar contains signed entries that's not signed by alias in this keystore.

и у JWS, и у моего браузера есть сертификат "Thawte Premium Server CA".

Проблема возникает, даже если кеш JWS и область загрузки браузера пусты.

Я не верю, что сообщение «KeyUsage» актуально, потому что 1) та же цепочка сертификатов используется для другого приложения, которое запускается успешно; и 2) документация, которую я прочитал, указывает на то, что ЦС для подписи кода Thawte используется только для проверки сертификата UNIDATA, а не для подписи кода.

Моя среда - Linux 2.6.27.41-170.2.117.fc10.x86_64, Firefox 3.6.8 (i686) и Java 1.7.0-ea.

Почему не запускается это приложение?

ОБНОВЛЕНИЕ: я обнаружил, что приложение запускается, если атрибут «codebase» в файле JNLP ссылается на локальный каталог, но не на URL-адрес, лежащий в основе аутентификации пользователя. В последнем случае javaws (1) интерпретирует веб-страницу аутентификации как файл JNLP (с очевидными результатами), если вызывается из командной строки. Если вызывается сценарием «deployJava» с аутентифицирующей пользователя веб-страницы (чтобы в браузере был файл cookie сеанса), то javaws (1) сообщает, что приложение не подписано. Я нахожу оба этих режима отказа странными, поскольку в документации javaws (1) говорится, что он понимает аутентификацию пользователей на веб-страницах, а файл jar подписан.


person Steve Emmerson    schedule 17.08.2010    source источник
comment
Как вы подписываете свой jar-файл? Я столкнулся с подобными проблемами при использовании задачи signjar в ant, где для атрибута lazy было установлено значение true. Удаление атрибута lazy=true в значительной степени решило проблемы.   -  person Pram    schedule 17.08.2010
comment
@Pram Я использую эту запись ant (1): ‹signjar jar = $ {run-jar} alias = idv keystore = $ {key-dir} /. Keystore storepass = ... /›. Атрибут lazy не используется.   -  person Steve Emmerson    schedule 17.08.2010


Ответы (3)


Я использую Gentoo Linux, использую OpenJDK 7, и я думаю, что столкнулся с той же проблемой.

Мне не удалось заставить его работать с OpenJDK 7. Только повторная подпись с выпуском Sun Java 6 JDK в конечном итоге правильно подписала приложение. (Я также перестроил все это, потому что им управлял муравей, хотя я не знаю, нужно ли это).

Простое переключение на официальный JDK 6 без перестройки только приводит к исчезновению предупреждения «[CertPath not validated: null]» при изменении с помощью «jarsigner -verify -verbose -certs», но не работает в приложении, которое я в конечном итоге использую.

person Radtoo    schedule 03.12.2010

  1. убедитесь, что вы не используете кешированную (беззнаковую) версию jar. Очистите временную папку, в которой JWS загружает jar-файлы.
  2. убедитесь, что все зависимости (jar-файлы) вашего jar-файла, требующие специальных разрешений, также подписаны
person Bozho    schedule 17.08.2010
comment
Проблема возникает, даже если кеш JWS пуст. Есть только один jar-файл, и он содержит только классы. - person Steve Emmerson; 17.08.2010

Убедитесь, что ваши вызовы в апплете заключены в блок doPrivileged. Я не уверен, почему это работает так, но, похоже, работает как шарм.

person Nikola Yovchev    schedule 11.11.2010
comment
Приложение является автономным: это не апплет. - person Steve Emmerson; 13.11.2010