Как подписать (динамические) файлы 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 подписи. Как это будет сделано?
Ответы
Ответ 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, поэтому я не могу попробовать его прямо сейчас.