AccessControlException при запуске встроенного Tomcat из Java Webstart - PullRequest
4 голосов
/ 23 марта 2012

Для нашего веб-приложения Kunagi Java у нас есть подписанный файл kunagi.jar, который содержит наши классы вместе с классами из встроенного Tomcat 6. Он отлично работает при вызове java -jar kunagi.jar.

Но при запуске с Java WebStart я получаю исключение при запуске встроенного Tomcat:

java.security.AccessControlException: access denied (java.lang.RuntimePermission accessClassInPackage.org.apache.catalina.deploy)
    at java.security.AccessControlContext.checkPermission(AccessControlContext.java:393)
    at java.security.AccessController.checkPermission(AccessController.java:553)
    at java.lang.SecurityManager.checkPermission(SecurityManager.java:549)
    at java.lang.SecurityManager.checkPackageAccess(SecurityManager.java:1529)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:291)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:266)
    at net.sourceforge.jnlp.runtime.JNLPClassLoader.loadClass(JNLPClassLoader.java:1018)
    at java.lang.Class.getDeclaredMethods0(Native Method)
    at java.lang.Class.privateGetDeclaredMethods(Class.java:2444)
    at java.lang.Class.getMethod0(Class.java:2687)
    at java.lang.Class.getMethod(Class.java:1620)
    at org.apache.catalina.startup.SetPublicIdRule.begin(WebRuleSet.java:639)
    at org.apache.tomcat.util.digester.Digester.startElement(Digester.java:1276)
    ... 33 more

Конечно, kunagi.jar подписано, иначе оно даже не запустится. Он использует Java WebStart для глобальной безопасности Java, которая каким-то образом встроенным Tomcat «наследует» и не может инициализироваться.

Вот файл JNLP:

<?xml version="1.0" encoding="UTF-8"?>
<jnlp spec="1.0+" codebase="http://kunagi.org/webstart" href="kunagi.jnlp">
    <information>
        <title>Kunagi</title>
        <vendor>Kunagi Team</vendor>
        <homepage href="http://kunagi.org"/>
        <description>SCRUM Tool</description>
        <description kind="short">SCRUM Tool</description>
        <offline-allowed/>
    </information>
    <security>
        <all-permissions/>
    </security>
    <resources>
        <j2se version="1.6+" href="http://java.sun.com/products/autodl/j2se"/>
        <jar href="kunagi.jar" main="true" />
    </resources>
    <application-desc name="Kunagi" main-class="katokorbo.Katokorbo"/>
    <update check="always"/>
</jnlp>

Есть ли способ отключить проверки безопасности для Tomcat внутри Java WebStart? Или как настроить встроенный Tomcat для разрешения доступа к org.apache.catalina...?

Ответы [ 8 ]

3 голосов
/ 26 марта 2012

@ Witek: Tomcat не включает SecurityManager: JVM должна быть запущена с включенным SecurityManager и установленным файлом политики. Tomcat запускается через некоторое время после установки SecurityManager.

3 голосов
/ 26 марта 2012

Tomcat реализует правила доступа Security Manager в разных местах.Соответствующие определения политики можно найти в tomcat / conf / catalina.policy.

Это не будет ошибкой в ​​Tomcat, если a) включен Security Manager и b) требуемый файл политики не применяется.

Конечно, Tomcat содержит код в различных пакетах, и, конечно, было бы нормально использовать классы из этих пакетов.

ОБНОВЛЕНИЕ: У меня нет проблем с запуском вашего приложения JNLPв моей песочницеTomcat запускается успешно, за некоторыми исключениями, которые не связаны с тем, который вы описываете.Я бы попытался удалить все ранее загруженные файлы и очистить все сертификаты из вашего кэша.

Я бы также предложил обновить его до последней версии Tomcat 6.0.

2 голосов
/ 02 апреля 2012

java.security.AccessControlException: доступ запрещен (java.lang.RuntimePermission accessClassInPackage.org.apache.catalina.deploy)

Всякий раз, когда вы получаете AccessControlException, часть вскобки - это разрешение, которое необходимо предоставить в файле .policy или, если вы используете JWS, в дескрипторе развертывания.

2 голосов
/ 29 марта 2012

Tomcat, похоже, использовал свои разрешения для изменения глобального состояния (здесь свойство безопасности package.access). Подписанные jar-файлы могут запускаться в процессах, которые используются ненадежным кодом. Вы действительно не хотите смешивать два больше, чем необходимо. Так что не похоже, что Tomcat, из которого он используется здесь, подходит для WebStart.

(Oracle JRE имеет функцию трассировки проверки безопасности - -Djava.security.debug=all, IIRC).

2 голосов
/ 23 марта 2012

Решением будет цифровая подпись банок, которые запрашивают разрешение, требующее доверия. Все, что не подписано и не требует доверия, нужно будет перенести в расширение JNLP.

1 голос
/ 26 марта 2012

Если честно, это похоже на ошибку в Tomcat, и вам, вероятно, следует сообщить об этом. Он не должен пытаться получить методы класса в другом пакете, так как это всегда завершится ошибкой в ​​диспетчере безопасности.

Однако, до тех пор, пока ошибка не будет исправлена, не можете ли вы избежать вызова вещи "WebRuleSet"? Я не знаю, что это на самом деле, но похоже, что это будет вызвано из-за вашей конфигурации Tomcat. Разве это не то, что вы можете удалить из конфига?

0 голосов
/ 27 апреля 2017

вы можете редактировать ваш файл политики. например, у вас возникнет проблема с безопасностью при развертывании войны администратора, вам придется отредактировать файл catalina.policy, расположенный в каталоге conf tomcat, так, чтобы он имел низкую запись, как показано ниже, для решения этой проблемы.

grant codeBase "file:${catalina.base}/webapps/admin/-" {
                permission java.security.AllPermission;
};
0 голосов
/ 03 апреля 2012

Я решил свою проблему следующим образом:

Отключить диспетчер безопасности после того, как WebStart запустил мое приложение.Первая строка в моем методе main():

System.setSecurityManager(null);

Скажите Tomcat использовать загрузчик классов по умолчанию:

context.setLoader(new WebappLoader(getClass().getClassLoader()));

Теперь Tomcat работает в WebStart: -D

...