Пользователь
0,0
рейтинг
7 ноября 2013 в 13:25

Разработка → Как подписать JAVA апплет из песочницы tutorial

JAVA*
Привет, любимый читатель.
Сегодня ты узнаешь как подписать JAVA апплет. Для начала скажу, что JAVA апплеты имеют ограниченную функциональность, пока они не подписаны. Например, неподписанные апплеты не могут:
  • взаимодействовать с локальной файловой системой клиента;
  • устанавливать сетевые соединения с другими серверами;
  • взаимодействовать с буфером обмена клиента;
  • некоторые другие.


Вариантов решения проблемы несколько:
1. Разрешить выполнение на каждой локальной машине клиентов. Для этого можно отредактировать файл java.policy, который находится в папке с установленным JRE (по умолчанию в C:\Program Files\Java\jre6\lib\security). И добавить необходимые разрешения. Например, чтобы разрешить все, что можно, нужно вставить строчку:

grant {
	...
	permission java.security.AllPermission;
}


А если нужно разрешить только работу с буфером обмена для сайта hackmeplease.com:

grant codeBase "http://hackmeplease.com/*" {
	permission java.awt.AWTPermission "accessClipboard";
};


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

2. Подписать свой Java-апплет. Итак, что имеем на входе:
— установленные JDK и JRE;
— jar-файл своего апплета (есть некоторые особенности написания исходного кода, см. ниже);
— желание работать с буфером обмена. Для этого нужно, чтобы корректно работала строчка:

Toolkit toolkit = Toolkit.getDefaultToolkit();
Clipboard clipboard = toolkit.getSystemClipboard();

В случае вызова этих строчек, из неподписанного апплета получим следующее исключение:
java.security.AccessControlException: access denied (java.awt.AWTPermission accessClipboard)

Итак, приступим:
0. Переходим в папку BIN нашего JDK (например, C:\Program Files\Java\jdk1.6.0_23\bin).
I. Создаем локальное хранилище нашего сертификата (keystore):
keytool -genkey -keystore .keystore -alias «Terrasoft» -validity 99999
где Terrasoft — название alias нашего сертификата;
99999 — срок в месяцах валидности сертификата;
.keystore — имя файла создаваемого хранилища.

В случае успешного запуска команды, система спросит нас пароль нашего хранилища, а также некоторую информацию о сертификате (твои ФИО, название компании, город, страну и группу крови)

В результате будем иметь файл .keystore. Это и есть наше хранилище, которым мы будем подписывать разные апплеты.
II. Копируем в папку BIN нашего JDK наш JAR-файл. Подписываем его с помощью следующей команды:
jarsigner.exe -keystore .keystore ClipboardLibrary.jar «Terrasoft»
где Terrasoft — название alias нашего сертификата;
.keystore — имя файла хранилища;
ClipboardLibrary.jar — название JAR-файла.
Система спросит нас пароль — вводим тот, что ввели в п. I.

Вроде как готово… Да щас, наивный…
Итак, при запуске страницы с нашим апплетом на борту пользователь получит дружественное сообщения вида:


Что означает, «Пользователь, нажми Да и попрощайся со своей системой, ибо мы сможем с ней делать, что захотим».
Кстати, обратите внимание на NOT VERIFIED. Означает, что у нас не доверительный сертификат. Чтобы получить доверительный, нужно обращаться в специальные службы в инете и даже платить деньгу.

Но вернемся к нашим баранам. При обращении к буферу обмена мы снова получим исключение вида:
java.security.AccessControlException: access denied (java.awt.AWTPermission accessClipboard)

Очень жаль. Ну что же, не получилось сейчас — получится в другой раз. До свидания.

Шучу. На самом деле на этом моменте останавливаются все руководства по подписыванию апплетов, которые я встречал. Мол, подписанному апплету ничего не страшно. Пусть им всем будет стыдно.
Короче, следующий финт для того, чтобы наше обращение к буферу обмена заработало:

III. Изменить исходный код.
Вместо вызова вида:
clipboard = toolkit.getSystemClipboard()

нужно написать вызов вида:
clipboard = (Clipboard) AccessController.doPrivileged(new PrivilegedAction() {
	public Object run() {
		return toolkit.getSystemClipboard();
	}
});

После этого нужно перекомпилировать свой JAR и повторить шаг II (тем, кто читал с конца мое сообщение — респект).

Вот в общем-то и все. Должно работать. Надеюсь, что кому-то это пригодится, и он не будет столько своей жизни тратить на эту ерунду, сколько потратил я. Нехай проблеми i негоди не роблять вам в життi погоди (С). До новых встреч в эфире.
Артём Репко @fufnf
карма
1,0
рейтинг 0,0
Реклама помогает поддерживать и развивать наши сервисы

Подробнее
Реклама

Самое читаемое Разработка

Комментарии (9)

  • 0
    Стоит так же заметить, что в JDK 7u51 (январь 2014) по-умолчанию будут блокироваться все unsigned и self-signed Java Applet и Java Web Start приложения.
    • 0
      Не подскажите каким сертификатом нужно подписать? Я так понял что нужно подписывать девелоперским сертификатом от любого SSL провайдера…
      • 0
        Именно так. Необходимо купить сертификат для подписи JAR файлов у одного из официальных Certification Authority. Например, у Thawte Inc.
        • 0
          Подскажите можно ли разрешить работу self-signed Java Applet на компьютере клиента правкой конфигурационных файлов или другой магией?
          Административный доступ к клиентской машине есть. Покупка сертификата для работы Java Applet внутренней разработки компании не имеет смысла тк он работает внутри локальной сети.
          • 0
            А способ, описанный в первой части статьи (файл java.policy), не подходит?
            • 0
              Я прописал в файле C:\Program Files (x86)\Java\jre7\lib\security\java.policy
              grant {

              permission java.security.AllPermission;
              }
              не помогло.
              Я пробовал экспортировать сертификат и добавить его в Доверительные сертификаты настроек Java, также не помогло.
              Что-то я делаю не правильно, вот только что?
              • 0
                Вот здесь подробно описана проблема и способ ее решения: http://www.java.com/en/download/help/java_blocked.xml.
                • 0
                  спасибо)
                  после выхода 51-го апдейта проблема решилась, при помощи чудо кнопки «Exception Site list»
    • 0
      А не подскажите как это поведение отключить? А то сломалось много систем на которые я никак повлиять не могу, а работать надо.

      p.s: прошу прощения, уже разобрался. Просто в панике был малость )

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