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

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

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

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

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

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

Что мне не нужно в качестве ответов: щелкните правой кнопкой мыши и откройте, чтобы переопределить Gatekeeper или изменить настройки системы или Java. Это не вариант.

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

5 ответов

Решение

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

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

Однако требуется, чтобы у вас был действительный сертификат "Application ID Application"

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

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

Я надеюсь, что это поможет многим разработчикам исправить неправильное поведение JNLP с OSX.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Просто чтобы подвести итог обсуждения; в настоящее время не существует никакого решения о том, как обойти это.

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

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

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

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

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

Другие вопросы по тегам