Подписанный апплет загружает подписанные jar-файлы, используя URLClassLoader с проблемой безопасности - PullRequest
3 голосов
/ 16 сентября 2011

У меня есть подписанный апплет.Для реализации некоторой архитектуры плагинов я загружаю и сохраняю на диск JAR-файл с конкретными классами.

Затем я загружаю эти классы с URLCLassLoader.Итак, теперь я пытаюсь вызвать какой-либо метод из загруженного класса, и у меня возникает проблема безопасности.

Кажется, "sign-token" не может быть проверен SecurityManager, когда загруженный класс равен URLClassLoaded.Кто-нибудь знает, как решить эту проблему?

Большое спасибо!

Загрузка.

URLClassLoader loader = new URLClassLoader(new URL[] {libraryArchive.toURI().toURL()}, Compress.class.getClassLoader());

Вызов.

...
org.palettelabs.comm.desktopcapture.pim.Library lib = libraryClass.newInstance();
                final Compress compressingLibrary = (Compress) lib;
                File file = AccessController.doPrivileged(new PrivilegedExceptionAction<File>() {

                    @Override
                    public File run() {
                        try {
                            File file = compressingLibrary.compress(filesList);
                            return file;
                        } catch (Exception e) {
                            Logger.error("applet: compress: invocation external library error", e);
                            return null;
                        }
                    }

                });

Исключение.

2011-09-16 16:00:08,550 [SwingWorker-pool-1-thread-4] ERROR - applet: compress: invocation external library error
java.security.AccessControlException: access denied (java.io.FilePermission /tmp/dca-palettelabs-storage/test/compress/linux32ffmpeg.jar-extractedFiles/org/palettelabs/
comm/desktopcapture/libs/compress/linux32 read)
        at java.security.AccessControlContext.checkPermission(AccessControlContext.java:374)
        at java.security.AccessController.checkPermission(AccessController.java:546)
        at java.lang.SecurityManager.checkPermission(SecurityManager.java:532)
        at java.lang.SecurityManager.checkRead(SecurityManager.java:871)
        at java.io.File.exists(File.java:731)
        at java.io.File.mkdirs(File.java:1181)
        at org.palettelabs.comm.desktopcapture.pim.Library.extract(Library.java:31)
        at org.palettelabs.comm.desktopcapture.libs.compress.linux32.Linux32.compress(Linux32.java:17)
        at org.palettelabs.comm.desktopcapture.ui.UploadingWorker$1.run(UploadingWorker.java:77)
        at org.palettelabs.comm.desktopcapture.ui.UploadingWorker$1.run(UploadingWorker.java:1)
        at java.security.AccessController.doPrivileged(Native Method)
        at org.palettelabs.comm.desktopcapture.ui.UploadingWorker.compress(UploadingWorker.java:72)
        at org.palettelabs.comm.desktopcapture.ui.UploadingWorker.doInBackground(UploadingWorker.java:57)
        at org.palettelabs.comm.desktopcapture.ui.UploadingWorker.doInBackground(UploadingWorker.java:1)
        at javax.swing.SwingWorker$1.call(SwingWorker.java:277)
        at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303)
        at java.util.concurrent.FutureTask.run(FutureTask.java:138)
        at javax.swing.SwingWorker.run(SwingWorker.java:316)
        at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
        at java.lang.Thread.run(Thread.java:662)

Ответы [ 2 ]

1 голос
/ 05 октября 2011

Используйте соответствующий подкласс java.security.SecureClassLoader, чтобы назначить соответствующий ProtectionDomain загруженным классам.Конечно, нужно убедиться, что этим классам доверяет какой-то механизм (например, подписанный сертификатом, которому вы доверяете в таких целях).

1 голос
/ 20 сентября 2011

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

Для этого позвоните System.setSecurityManager(myManager).(Как вы уже поняли) myManager является расширением SecurityManager .

. Для установки менеджера безопасности требуется доверенный апплет.

...