Настройка политик для апплета, встроенного в HTML - PullRequest
3 голосов
/ 15 марта 2011

Я разработал апплет, чтобы сделать снимок экрана и сохранить его на компьютере пользователя с помощью класса java.awt.Robot. Мне нужно встроить этот апплет в html-страницу (используя тег объекта), чтобы при нажатии на кнопку на веб-странице был сделан снимок экрана.

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

Когда я испытываю трудности, я настраиваю разрешения для запуска из встроенного местоположения. Очевидно, что класс роботов несколько опасен, поэтому необходимо установить AWTPermission и подписать сам апплет.

Я прошел учебник по http://download.oracle.com/javase/tutorial/security/toolsign/index.html и сумел создать подписанный файл .jar, а затем файл политики, который позволил запустить демонстрационное приложение из этого учебника. Теперь я сталкиваюсь с проблемами в том, как согласовать то, что я узнал, с ситуацией, в которой будет использоваться мой апплет.

Моя целевая аудитория составляет около 100 машин, и мне нужно, чтобы она была исполняемой на всех из них. Я упаковал свой java-файл .class в .jar и подписал его, используя keytool и jarsigner. Затем я загрузил файлы .jar и .cer в каталог сервера, где размещены соответствующие страницы.

Однако: когда я затем использовал policytool для создания нового файла политики на одном из компьютеров для тестирования установки, я все еще не могу выполнить апплет из HTML. Я получаю Java.Security.AccessControlException Acess Denied java.awt.AWTPermission createRobot ошибки.

Я скорее подозреваю, что это политический шаг, который идет не так, поэтому я опишу шаги, которые я предпринял: Я загружаю сертификат на локальный компьютер и генерирую из него хранилище ключей, запускаю «policytool» из этого каталога через командную строку Я добавляю каталог на локальный компьютер, на котором сгенерировано хранилище ключей, и мой сертификат. Затем я нажимаю кнопку добавления политики и ввожу псевдоним SignedBy. Затем добавьте разрешения и выберите AWTPermission Название цели я выбираю createRobot Поле функции, которое я оставил пустым, так как не могу понять, что здесь применимо Подписано в этом окне также оставлено пустым Затем я нажимаю «ОК» и «Готово» и получаю предупреждение о том, что для псевдонима, введенного на первом шаге, нет открытого ключа. Я выполняю команду «сохранить как» и сохраняю свой файл политики в том же каталоге, в котором размещен сертификат и сгенерированное из него хранилище ключей.

Это не позволяет мне запускать апплет с веб-страницы, и мое ограниченное понимание этого аспекта программирования не дает никаких подсказок относительно того, что пошло не так.

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

РЕДАКТИРОВАТЬ: Забыл упомянуть шаг. Я вручную добавил в свой файл jre \ lib \ security \ java.security строку 'policy.url.3 = file: / C: / Testing / debugpolicy', поскольку это путь и имя файла политики, которые я создал на предыдущих этапах. Мне также только что удалось удалить предупреждение, о котором я упоминал ранее, я смешивал свой псевдоним и давал псевдоним для личного хранилища ключей, а не для общего, при создании файла политики, однако я все еще сталкиваюсь с теми же проблемами

1 Ответ

7 голосов
/ 15 марта 2011

Если апплет правильно подписан, файл политики не требуется, и при этом не требуется отдельно загружать какой-либо сертификат.Правильно подписанный апплет запросит у пользователя разрешение при посещении апплета до его загрузки.Появляется ли приглашение?

Вот небольшая демонстрация.Я написал, что демонстрирует Оборонительная загрузка доверенных апплетов .Это приглашение к безопасности, о котором я говорю.

Если апплет имеет цифровую подпись разработчика и доверяется конечному пользователю, он должен иметь возможность сделать снимок экрана.

Есть еще одна вещь, которую вы можете попробовать, если апплет является доверенным, как эксперимент (1). В начале апплета init(), позвоните System.setSecurityManager(null).Это и проверит, доверяет ли апплет, и сотрет последние остатки «доверенного» менеджера безопасности, данного апплетам.

И в случае, если это работает, и это делает снимок экрана успешным, он предлагаетлибо ошибка, либо Oracle изменили свое мнение о настройках того, что может сделать доверенный апплет.

1) Не делайте этого в реальном мире или в производственной среде. По словам Тома Хоутина:

Этот вопрос, похоже, создает впечатление, что звонить по номеру System.setSecurityManager(null); можно.... Если у кого-то есть сомнения, изменение глобального состояния в апплете повлияет на все апплеты в одном процессе.Очистка диспетчера безопасности позволит любому неподписанному апплету делать то, что ему нравится.Пожалуйста, не подписывайте код, который играет с глобальным состоянием, с сертификатом, которому вы доверяете.


Редактировать 1: Вот источник простого апплета, использованного в этой демонстрации.По какой-то причине, когда я первоначально загрузил его, я решил, что источник не имеет значения.OTOH 3 человека теперь попросили увидеть источник, по той или иной причине.Когда я получу круглую плату, я загрузлю источник на свой сайт.А пока я выложу это здесь.

package org.pscode.eg.docload;

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.net.*;
import java.io.*;
import java.security.*;

/** An applet to display documents that are JEditorPane compatible. */
public class DocumentLoader extends JApplet {
    JEditorPane document;

    @Override
    public void init() {
        System.out.println("init()");

        JPanel main = new JPanel();
        main.setLayout( new BorderLayout() );
        getContentPane().add(main);
        try {
            // It might seem odd that a sandboxed applet can /instantiate/
            // a File object, but until it goes to do anything with it, the
            // JVM considers it 'OK'.  Until we go to do anything with a
            // 'File' object, it is really just a filename.
            File f = new File(".");

            // set up the green 'sandboxed page', as a precaution..
            URL sandboxed = new URL(getDocumentBase(), "sandbox.html");
            document = new JEditorPane(sandboxed);
            main.add( new JScrollPane(document), BorderLayout.CENTER );
            // Everything above here is possible for a sandboxed applet

            // *test* if this applet is sandboxed
            final JFileChooser jfc =
                new JFileChooser(f); // invokes security check
            jfc.setFileSelectionMode(JFileChooser.FILES_ONLY);
            jfc.setMultiSelectionEnabled(false);

            JButton button = new JButton("Load Document");
            button.addActionListener( new ActionListener(){
                    public void actionPerformed(ActionEvent ae) {
                        int result = jfc.showOpenDialog(
                            DocumentLoader.this);
                        if ( result==JFileChooser.APPROVE_OPTION ) {
                            File temp = jfc.getSelectedFile();
                            try {
                                URL page = temp.toURI().toURL();
                                document.setPage( page );
                            } catch(Exception e) {
                                e.printStackTrace();
                            }
                        }
                    }
                } );
            main.add( button, BorderLayout.SOUTH );

            // the applet is trusted, change to the red 'welcome page'
            URL trusted = new URL(getDocumentBase(), "trusted.html");
            document.setPage(trusted);
        } catch (MalformedURLException murle) {
            murle.printStackTrace();
        } catch (IOException ioe) {
            ioe.printStackTrace();
        } catch (AccessControlException ace) {
            ace.printStackTrace();
        }
    }

    @Override
    public void start() {
        System.out.println("start()");
    }

    @Override
    public void stop() {
        System.out.println("stop()");
    }

    @Override
    public void destroy() {
        System.out.println("destroy()");
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...