java.security.AccessControlException: доступ запрещен (java.lang.RuntimePermission loadLibrary.jpcap)

У меня есть приложение для моего школьного проекта, в котором есть классы jpcap, и я получаю эти исключения при попытке запустить файл jar:

java.lang.ExceptionInInitializerError
...
Caused by: java.security.AccessControlException: access denied ("java.lang.RuntimePermission" "loadLibrary.jpcap")
at java.security.AccessControlContext.checkPermission(Unknown Source)
at java.security.AccessController.checkPermission(Unknown Source)
at java.lang.SecurityManager.checkPermission(Unknown Source)
at sun.plugin2.applet.FXAppletSecurityManager.checkPermission(Unknown Source)
at java.lang.SecurityManager.checkLink(Unknown Source)
at java.lang.Runtime.loadLibrary0(Unknown Source)
at java.lang.System.loadLibrary(Unknown Source)
at jpcap.JpcapCaptor.<clinit>(JpcapCaptor.java:251)
... 12 more

Есть ли способ разрешить мой код без добавления:

grant { permission java.security.AllPermission; };

в jre location\lib\security\java.policy?


person joeNio    schedule 16.02.2014    source источник


Ответы (1)


Всем, у кого такая же проблема:

  1. Во-первых, вам нужно будет добавить файл MANIFEST.MF в ваш апплет. Проверьте: Самый простой способ добавить атрибут в jar-манифест в Maven для способа подписания и добавления файла манифеста в ваш апплет. Убедитесь, что эта конфигурация не переопределена в настройках параметров апплета.

  2. Java 8+ требует подписанных апплетов, поэтому вам придется подписать свой апплет. Если вы находитесь в среде разработки, вам придется самостоятельно подписать свой апплет и добавить этот сертификат в панель управления Java. См. это для способ добавления самоподписанных сертификатов в список доверенных сертификатов в среде выполнения Java .

  3. Даже после этого есть код, который будет работать только с PrivilegedActions. См. этот ответ: https://stackoverflow.com/a/1730904/2692914.

Во всяком случае, вот как я это сделал, я использовал этот минимальный Java-апплет, созданный с помощью Maven в качестве базового проекта.

MANIFEST.MF

Manifest-Version: 1.0
Application-Name: One Applet
Codebase: *
Permissions: all-permissions
Application-Library-Allowable-Codebase: *
Caller-Allowable-Codebase: *
Trusted-Only: false
Trusted-Library: false

pom.xml

<build>
<plugins>
...
<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-assembly-plugin</artifactId>
    <configuration>
        <descriptorRefs>
            <descriptorRef>jar-with-dependencies</descriptorRef>
        </descriptorRefs>
        <archive>
            <index>true</index>
            <manifestFile>${project.basedir}/MANIFEST.MF</manifestFile>
            <manifest>
                <addDefaultImplementationEntries>true</addDefaultImplementationEntries>
            </manifest>
        </archive>
    </configuration>
    <executions>
        <execution>
            <id>make-assembly</id>
            <phase>package</phase>
            <goals>
                <goal>attached</goal>
            </goals>
        </execution>
    </executions>
</plugin>
<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-jarsigner-plugin</artifactId>
    <version>1.2</version>
    <configuration>
        <keystore>src/main/resources/minimal-keystore.jks</keystore>
        <alias>minimal</alias>
        <storepass>abcd1234</storepass>
        <keypass>abcd1234</keypass>
    </configuration>
    <executions>
        <execution>
            <id>sign</id>
            <goals>
                <goal>sign</goal>
            </goals>
        </execution>
        <execution>
            <id>verify</id>
            <goals>
                <goal>verify</goal>
            </goals>
        </execution>
    </executions>
</plugin>
...
</plugins>
</build>

минимальный.cer

keytool -export -keystore minimal-keystore.jks -alias minimal -file minimal.cer

Добавление сертификата в панель управления Java

SomeClass.java

try {
    AccessController.doPrivileged(new PrivilegedAction() {
        public Object run() {
            try {
                for (String dll : dlls) {
                    String dllPath = basePath + dll;
                    System.out.println("Cargando: " + dllPath);
                    System.load(dllPath);
                }
                return null;
            } catch (Exception e) {
                e.printStackTrace();
                throw e;
            }
        }
    });
} catch (Exception e) {
    e.printStackTrace();
    throw e;
}

Ну вот и все!

person lmiguelmh    schedule 03.12.2014