Исключение разрешений на бросание банок с помощью appletviewer

Я пытаюсь устранить проблему с подписанными банками, не работающими под appletviewer. Моя главная цель - запустить его вне браузера, поэтому я попытался использовать appletviewer - если у вас есть другие предложения, дайте мне знать.

Вот контекст:

  • Ubuntu 11.10
  • Джава:

    $ java -version
    java version "1.6.0_26"
    Java(TM) SE Runtime Environment (build 1.6.0_26-b03)
    Java HotSpot(TM) 64-Bit Server VM (build 20.1-b02, mixed mode)
    

Вот проблема:

  • У меня есть jar myjar.jar, который содержит апплет внутри
  • Он работает правильно в браузере, но не при запуске под appletviewer
  • Баночка подписана:

    $ jarsigner -verify -certs -verbose -keystore /etc/ssl/certs/java/cacerts myjar.jar
    ...
    smk     <file size> <file date> <file name>
    
          X.509, CN=xxx, OU=xxx, OU=xxx, O=xxx, L=xxx, ST=xxx, C=xxx
          [certificate is valid from m/d/y h:m PM to m/d/y h:m PM]
          X.509, CN=yyy, OU=yyy, OU=yyy, O=yyy, C=yyy
          [certificate is valid from m/d/y h:m PM to m/d/y h:m PM]
          [KeyUsage extension does not support code signing]
          X.509, OU=zzz, O=zzz, C=zzz (alias1)
          [certificate is valid from m/d/y h:m PM to m/d/y h:m PM]
    ...
    jar verified.
    

и хотя промежуточный сертификат подписи (yyy выше) отсутствует, корневой сертификат (zzz - или alias1):

$ keytool -list -v -keystore /etc/ssl/certs/java/cacerts -storepass changeit|grep alias1
alias1, Mmm d, yyyy, trustedCertEntry,

Запуск этого:

$ appletviewer myhtml.html

дает:

Caused by: java.security.AccessControlException: access denied (java.lang.RuntimePermission preferences)

Вопрос 1:

  • Является ли предположение, что при наличии корневого сертификата все последующие промежуточные сертификаты считаются приемлемыми для целей проверки? В вышеприведенном случае необходимо ли иметь yyy в файле cacerts?
  • Когда jar подписан, как myjar.jar, предполагается, что appletviewer должен работать без ограничений?
  • Есть ли лучший способ запустить его, чтобы избежать этого?
  • Почему в браузере это работает иначе, чем в appletviewer?

Не будучи уверенным в вышесказанном, я попытался добавить сертификат в другой локальный файл, который называется cacerts2. Я могу подтвердить, что:

  • keytool перечисляет этот сертификат в cacerts
  • вывод jarsigner теперь выглядит так:

    $ jarsigner -verify -certs -verbose -keystore cacerts2 myjar.jar
    ...
    smk     <file size> <file date> <file name>
    
          X.509, CN=xxx, OU=xxx, OU=xxx, O=xxx, L=xxx, ST=xxx, C=xxx
          [certificate is valid from m/d/y h:m PM to m/d/y h:m PM]
          X.509, CN=yyy, OU=yyy, OU=yyy, O=yyy, C=yyy (alias2)
          [certificate is valid from m/d/y h:m PM to m/d/y h:m PM]
          [KeyUsage extension does not support code signing]
          X.509, OU=zzz, O=zzz, C=zzz (alias1)
          [certificate is valid from m/d/y h:m PM to m/d/y h:m PM]
    ...
    jar verified.
    

Обратите внимание, что теперь у меня есть промежуточный псевдоним (yyy - или alias2), присутствующий в выходных данных и проверенный как на alias1, так и на alias2. Запуск appletviewer, как это:

$ appletviewer -J-Djavax.net.ssl.trustStore=cacerts2 -J-Djavax.net.ssl.trustStorePassword=changeit myhtml.html

по-прежнему приводит к тому же исключению.

Вопрос 2:

  • Является ли вышеуказанный правильный способ снабжения магазина доверия?
  • Означает ли вышеизложенное, что appletviewer будет использовать его так же, как jarsigner при передаче команды -keystore для целей проверки?

Третье, что я попробовал, это создать файл политики, подобный этому (это в mypolicy.policy):

keystore "cacerts2";
// Tried with this and without the next line:
//keystorePasswordURL "cacerts.pass";
// where file cacerts.pass has only "changeit" / "changeit\n" in it (tried both)

// Tried the following three:
grant signedBy "alias1" {
//grant signedBy "alias2" {
//grant {
  permission java.lang.RuntimePermission "preferences";
};

и работает так:

$ appletviewer -J-Djava.security.policy=mypolicy.policy myhtml.html

а вот так:

$ appletviewer -J-Djavax.net.ssl.trustStore=cacerts2 -J-Djavax.net.ssl.trustStorePassword=changeit -J-Djava.security.policy=mypolicy.policy myhtml.html

Результаты:

  • Грант без каких-либо подписанных спецификаций работал, так что я могу подтвердить, что политика подобрана
  • грант с любым подписанным By терпит неудачу

Вопрос задан 3:

  • Это правильный способ указать политику и подписал? Я нахожу документы от Oracle неполными по этой теме
  • Файл политики даже используется, когда jar подписан?
  • Есть другие идеи?:)

1 ответ

Решение

Моя главная цель - запустить его вне браузера,..

Используйте Java Web Start, который может запускать апплеты в свободном обращении примерно за 1,2 дня. (Или преобразовать код во фрейм.)

Если основной целью этого является тестирование, вы можете попробовать Appleteer. AFAIR Я никогда не удосужился реализовать для нее "песочницу" (поэтому даже неподписанный код апплета вел себя так, как если бы ему доверяли).


AppletViewer используется для запуска апплетов без изолированной программной среды безопасности, даже если они не были подписаны. Теперь все наоборот и имеет песочницу, и нет способа заставить ее принять подписанный код как доверенный!

Кажется, IDE применяют файл политики к средству просмотра, чтобы заставить его действовать, однако пользователь настраивает IDE.

Другие вопросы по тегам