Подтвердить что ты не робот

Как подписать (динамические) файлы JNLP для OSX и Gatekeeper

Моя компания выпускает Java-приложения для серверов и предоставляет файлы JNLP для запуска локальных приложений. Поскольку OSX 10.8.4 требуется подписывать файлы JNLP с идентификатором разработчика, чтобы поддерживать гейткипер в счастливом состоянии (фактически в примечаниях к выпуску в самом низу).

Вопрос: как это сделать? AFAIK вы можете подписывать приложения (у нас есть Java-приложения, подписанные с идентификаторами разработчиков), но JNLP - файлы: это файлы.

Далее: как это сделать с сгенерированными файлами JNLP. Мы должны модифицировать их, поскольку они поступают с сервера. свойства, базовый URL и т.д.

AFAIK Java имеет определенный механизм, чтобы сказать, что файлы JNLP подписаны через их соответствующий JAR файл (тот, который содержит основной класс), но: файлы Jar подписаны с другим сертификатом они не будут удовлетворять и Gatekeeper.

Я нашел одну ссылку о том, как подписать инструменты и прочее, но она не применяется к сценарию динамических файлов.

Что я не хочу в качестве ответов: Right-Click и Open для переопределения гейткипера или изменения настроек System- или Java. Это не вариант.

[ОБНОВЛЕНИЕ] Начиная с OSX 10.9.5 вы также должны подписываться с использованием OSX 10.9+ и иметь действующие версии 2 подписи. Как это будет сделано?

4b9b3361

Ответ 1

Думаю, я нашел решение. Единственное, что я могу сейчас придумать. Нам в основном нужно обернуть JNLP с помощью специального запуска приложения, подписать приложение, убедиться, что мы можем модифицировать JNLP "на лету" на сервере, а затем запустить его.

Как вы, возможно, знаете, есть проект приложения, который может завершать любые JAR файлы в исполняемый файл OSX. Это может быть подписано, доставлено и не подведет Gatekeeper. Я создал пользовательскую вилку (которая предназначена для вытаскивания в основной вилке), которая может взять файл JNLP, завернуть его, и у вас есть собственное приложение, которое делает только все, что должен сделать JNLP.

Требование, однако, состоит в том, что у вас есть действительный сертификат "Приложение для удостоверения личности с разработчиками"

  • Перейдите к bitbucket.org и загрузите текущую версию
  • Запустите задачу ant и создайте пакет appbundler.
  • Посмотрите документацию для примера build script, который создаст контейнер приложения.
    • Пример не включает JNLP в приложение прямо сейчас.
    • Подпись приложений создается таким образом, что файл JNLP может быть изменен позже.
    • Приложение помещается в zip файл. Это важно для загрузки приложения, поскольку это только каталоги.
  • Создайте код сервера. Загрузите ZIP файл, поместите файл JNLP в каталог <yourapp>.app/Contents/Java/
  • Доставить zip файл.

Теперь, если все будет хорошо, zip файл должен автоматически распаковываться в папке "Загрузить", и вы должны увидеть значок своего приложения. Если вы действительно не ошиблись, вы можете выполнить приложение, как если бы оно было обычным.

Надеюсь, это поможет большому числу разработчиков, исправляющих нарушение JNLP-поведения с OSX.

[ОБНОВЛЕНИЕ для модифицируемых JNLP] Поскольку OSX 10.9.5 требуется наличие действительных подписей версии 2 в вашем приложении. Это означает, что это трюк, который ранее использовался приложением для приложения (набор файла списка ресурсов), больше не работает. Все и все должно быть подписано сейчас, и после этого практически невозможно изменить подписанное приложение.

Однако я нашел способ: используйте приложение. Установите JNLP в файл внутри каталога Contents/_CodeSignature. Пока не копируйте свой модифицируемый JNLP, но делайте это, например. используя Java позже при исправлении zip (в любом случае вам понадобится код).

Обратите внимание: это действительно нужно, только если вы должны добавить динамический файл JNLP в контейнер приложения (вот о чем были вопросы)

ОБНОВЛЕНИЕ (08-2017)

Oracle выпустит Java 9 к концу сентября. Приложение не обрабатывает java9 vm правильно. Они изменили много API и способ работы javaws. Я должен сказать: придерживайтесь java8, если вы хотите использовать завернутые приложения JNLP.

Ответ 2

Мы смогли определить, что вы можете подписать файл jnlp с кодом, используя сертификат "Приложение для идентификатора разработчика", например:

codesign -f -s "Developer ID Application: " foo.jnlp

Результат этой операции, похоже, проходит через Gatekeeper на локальной машине. Тем не менее, похоже, что подпись хранится как расширенные атрибуты HFS, и в результате она не передается, если пользователь извлекает файл из транзакции HTTP.

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

Ответ 3

Из потока электронной почты с технической поддержкой Apple кажется официальным словом использовать инструмент xip, чтобы обойти зависимость от расширенных атрибутов HFS с помощью codesign:

Вместо кодового обозначения используйте xip (произносится как "chip" ) для создания подписанного архива вашего файла JNLP. Предоставьте своего разработчика ID Installer в качестве аргумента опции -sign, а не Идентификатор приложения идентификатора разработчика.

Архивирование архива - это, по существу, подписанный zip-архив, чтобы он мог обслуживаться через Интернет так же, как и zip-архив. Это будет автоматически распаковывается на клиентский Mac.

https://developer.apple.com/library/mac/documentation/Darwin/Reference/ManPages/man1/xip.1.html

Из моих экспериментов инструмент xip всегда генерирует архив с jnlp, содержащимся в папке, когда unxip'd.

Ответ 4

Просто подведем итоги дискуссии; в настоящее время нет существующего решения о том, как это сделать.

Это означает, что конечные пользователи не могут легко запускать приложение через JNLP. В основном нужно сказать пользователю правой кнопкой мыши и открыть, чтобы переопределить гейткипер.

Другим решением было бы сделать подписанное приложение Mac и установить его пользователями с помощью образа диска.

Ответ 5

Будет ли работать над объединением простой исполняемой оболочки script, называемой "myapp" в подписанном .dmg, который выглядит следующим образом:

javaws http://path/to/my/app.jnlp

таким образом вы можете изменить .jnlp, как вам нравится, без изменения .dmg. У меня нет идентификатора разработчика Apple, поэтому я не могу попробовать его прямо сейчас.