Почему 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 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 not signed by alias in this keystore.

и как JWS, так и мой браузер имеют сертификат для "Thawte Premium Server CA".

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

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

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

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

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

Ответы

Ответ 1

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

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

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

Ответ 2

  • убедитесь, что вы не используете кешированную (неподписанную) версию банки. Очистите папку temp, где JWS загружает jars
  • убедитесь, что все зависимости (банки) вашей банки, требующие специальных разрешений, также подписаны

Ответ 3

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