Усиленная среда выполнения для Java и Mojave

В настоящее время я распространяю приложение Java, упакованное и подписанное с помощью pkgbuild в macOS .

Недавно Apple предупреждает разработчиков:

"В следующем выпуске macOS Gatekeeper потребует, чтобы программное обеспечение с идентификатором разработчика было нотариально Яблоко."

Прочитав нотариально заверенные документы, Apple предупреждает разработчиков:

"Вы должны включить усиленную среду выполнения, чтобы ваше приложение было нотариально заверено Apple. "

Что касается некоторых подробностей о том, как включить эти настройки в Xcode. Но как насчет приложений, разработанных не с помощью Xcode? У Xamarin / Mono есть кое-что о том, как они справляются с этим, но коммиты так кажется, что они сосредоточены на обнаружении Mojave и C / C ++. А как насчет приложений Java или приложений, которые не распространяют скомпилированный код C / C ++ / Objective-C? Как проект «нотариально заверяется», чтобы он не был заблокирован будущим обновлением macOS?

Возможно, связано: Как оформить код и включить усиленную среду выполнения для стороннего интерфейса командной строки в Xcode?


person tresf    schedule 21.10.2018    source источник
comment
Привет, я наконец нашел решение. Проверьте мой: stackoverflow.com/questions/52905940   -  person SuperBerry    schedule 21.10.2018
comment
@superberry спасибо! Как это соответствует требованиям Apple по усилению защиты, которые, по-видимому, связаны с тем, как выполняется программное обеспечение? Например, что, если я распространю чистое приложение Python или Ruby (без скомпилированного кода)? Как тогда укрепить проект, чтобы Apple заверила нотариально? У вас, похоже, нет информации, необходимой Apple для нотариального заверения. См. Здесь: help.apple.com/xcode/mac /current/en.lproj/Art/   -  person tresf    schedule 21.10.2018
comment
Привет, если вы используете Xcode, вы можете найти переключатель усиленной среды выполнения в настройках сборки - ›Все. Если вы имеете в виду инструмент командной строки, я просто использую команду codeign в ответе на приведенную выше ссылку, чтобы заставить его работать как среду выполнения. Надеюсь, это сработает для вас.   -  person SuperBerry    schedule 21.10.2018
comment
Я не использую Xcode, приложение - Java. Ваш пример, похоже, просто применяет подпись кода к исполняемому файлу, а не выполняет требования по усилению защиты, не так ли?   -  person tresf    schedule 21.10.2018
comment
Согласно нашему разговору в другом потоке, @superberry утверждает, что опция --options runtime обрабатывает это. Это хорошее начало. В моем .pkg есть сценарии оболочки для установки и запуска, но только один большой толстый jar-файл. Некоторые компоненты _3 _ / _ 4_ в комплекте с JNI (собственный интерфейс Java). Java (уже установленная в системе) будет запускать их. Я понятия не имею, как выполнить эти новые требования. : /   -  person tresf    schedule 21.10.2018
comment
Прочитав twitter.com/rosyna/status/1004418504408252416, я отправил наш .pkg на оценку - - без изменений - с использованием xcrun altool --eval-app --primary-bundle-id <com.mysite.myapp> -u <myappleid@mydomain> -f <path/to/myapp.pkg>, и примерно через минуту он вернул RequestUUID = a1b2c3d4e5-a1b2-a1b2-a1b2-a1b2c3d4e5f6, который, по-видимому, я должен отслеживать с помощью xcrun altool --eval-info a1b2c3d4e5-a1b2-a1b2-a1b2-a1b2c3d4e5f6 -u <[email protected]> или по электронной почте. Обратите внимание, что пользовательское соглашение было изменено на сайте developer.apple.com, поэтому я вошел в систему и согласился перед попыткой.   -  person tresf    schedule 21.10.2018
comment
Решила подать на нотариальное заверение, чтобы узнать больше. Метод проб и ошибок находится здесь: github.com/qzind/tray/issues/ 372 # issuecomment-431674246   -  person tresf    schedule 21.10.2018
comment
Я получил нотариально заверенное сообщение по электронной почте ...   -  person SuperBerry    schedule 21.10.2018
comment
Мой запрос на нотариальное заверение был отклонен. В журнале JSON (доступном с помощью упомянутой выше команды --eval-info) объясняется, почему. Скомпилированные объекты (.dylib, .jnilib, НЕ сценарии, НЕ файлы JAR), которые поставляются с некоторыми сторонними библиотеками Java, которые мы объединяем, не подписаны. Мы изменим нашу систему сборки, чтобы подписать их, и посмотрим, как далеко мы продвинемся. Мое (умозрительное) ожидание состоит в том, что Apple (в настоящее время) заботится только об усилении защиты скомпилированных объектов, поэтому мы начнем с этого.   -  person tresf    schedule 21.10.2018
comment
Удалось пройти нотариальное заверение. Шаги были довольно сложными, они в отдельном ответе ниже.   -  person tresf    schedule 29.11.2018
comment
Почтовая ветка OpenJDK: mail.openjdk.java.net/ pipermail / jdk-dev / 2018-декабрь /   -  person ZhekaKozlov    schedule 19.12.2018


Ответы (3)


Я отвечаю на этот вопрос по поводу Java-проекта, требующего нотариального заверения. С небольшими изменениями ответ должен работать и для других типов проектов (python, powershell, node).

Примечание. Во время публикации этого сообщения команда Apple по нотариальному заверению позволила выполнить описанную ниже процедуру, однако по мере того, как нотариальное заверение и безопасность становятся все более распространенными и более строгими, Apple неизбежно изменит и улучшит требования и процедуры по усилению защиты. . Пожалуйста, отредактируйте, прокомментируйте или ответьте повторно, если необходимо.

Подпись кода

  • Для стандартного Java-приложения (.pkg или .app, содержащего скрипты, jar-файлы) нотариальное заверение должно пройти. Во время нотариального заверения Apple извлечет .jar и выполнит поиск собственных библиотек. Если он найдет неподписанный, он будет отклонен. Если нет, все в порядке. Инструкции по нотариальному заверению с использованием xcrun приведены ниже.
  • Для приложения Java, которое содержит собственные вызовы (например, JNI) к связанным библиотекам (.dylib, .jnilib), каждая связанная библиотека должна быть подписана с использованием сертификата «Приложения» (например, developerID_application.cer).

    • Certificates, Identifiers & Profiles, (Click "iOS, tvOS, watchOS" dropdown) macOS, Developer ID Application. (may also say "with Kext"). apple developer portal
    • Если у вас нет этого сертификата, вам нужно запросить его с помощью CSR. В моем случае у меня изначально был только сертификат для установщиков упаковки (а не кодовая подпись). Этот процесс может оказаться сложным, особенно если вы используете один и тот же закрытый ключ для двух сертификатов. Если вы застряли, используйте openssl через командную строку (вместо Keychain Access).
    • После получения сертификата подписать каждую собственную библиотеку .dylib|.jnilib|.so|bin становится непросто. Общая идея состоит в том, чтобы использовать команду codesign против собственной библиотеки, чтобы она была подписана вами, разработчиком. Синтаксис:

      xargs codesign -s "P6DMU6694X" -v dependency.dylib

      ... где P6DMU6694X - это либо уникальный идентификатор разработчика, либо точное общее имя сертификата (подойдет любой вариант).

    • Для .jar файла это может быть особенно громоздким, так как каждый пакет нужно извлекать. , подписанный, а затем заархивированный.

Нотариальное заверение

  • После подписания собственных библиотек пакет необходимо отправить на нотариальное заверение с использованием xcrun.

    xcrun altool --eval-app --primary-bundle-id <bundle id> -u <iTunes Connect Account> -f <file path>

    Which may look something like this:

    xcrun altool --eval-app --primary-bundle-id com.domain.appname -u [email protected] -f appname.pkg

  • Вам будет предложено ввести пароль разработчика Apple (НЕ пароль, который вы используете для входа на свой Mac). Изменить: поскольку требуется двойной фактор, вам необходимо создать пароль приложения для этого шага!

  • Через несколько минут команда xcrun вернет уникальный идентификатор, который можно использовать, чтобы определить, было ли нотариальное заверение утверждено.

    RequestUUID = a1b2c3d4e5-a1b2-a1b2-a1b2-a1b2c3d4e5f6

  • Периодически проверяйте статус этого уникального идентификатора, чтобы видеть, был ли он одобрен или отклонен.
    xcrun altool --eval-info a1b2c3d4e5-a1b2-a1b2-a1b2-a1b2c3d4e5f6 -u [email protected]
  • Если отказано, они не скажут вам напрямую, почему, вы должны проанализировать ответ JSON.

    LogFileURL: https://osxapps-ssl.itunes.apple.com/itunes-assets/...

  • Прочтите JSON и устраните выявленные проблемы. JSON уменьшен, вы можете запустить его через красивое средство форматирования. Если проблем нет, значит ваше приложение нотариально заверено и имеет Ready for distribution.

    
    {
      "logFormatVersion": 1,
      "jobId": "a1b2c3d4e5-a1b2-a1b2-a1b2-a1b2c3d4e5f6",
      "status": "Accepted",
      "statusSummary": "Ready for distribution",
      "statusCode": 0,
      "archiveFilename": "appname.pkg",
      "uploadDate": "2018-10-26T05:41:12Z",
      "sha256": "e2350bda66...",
      "issues" null
    }
    

Сшивание

Наконец, сшивание сборки гарантирует, что пакет будет доверенным, даже если сетевое соединение недоступно.

(apple.com) Вы также должны прикрепить билет к своему программному обеспечению с помощью инструмента степлера, чтобы в будущие дистрибутивы он был включен. Это гарантирует, что Gatekeeper сможет найти билет, даже если сетевое соединение недоступно. Чтобы прикрепить билет к вашему приложению, используйте степлер:

xcrun stapler staple appname.pkg

Время выполнения

Дополнительное решение, предоставляемое @NaderNader, при объединении среды выполнения Java вместе с .app, необходимы дополнительные шаги, чтобы пометить дистрибутив как runtime с помощью флага --option=runtime, где P6DMU6694X - ваш идентификатор подписи:

codesign --force --deep --options=runtime -s "P6DMU6694X" /path/to/My.app
person tresf    schedule 28.11.2018
comment
Apple теперь требует двухфакторной аутентификации и установки пароля для конкретного приложения. Это можно сделать через appleid.apple.com, безопасность, создание пароля. - person tresf; 02.03.2019
comment
@tobihagemann рекомендовал, чтобы --eval-app было заменено на --notarize-app, а --eval-info было заменено на --notarization-info. Я нашел эти оригинальные команды в Твиттере, так что они устарели? Я был бы рад обновить их новыми командами, если бы была предоставлена ​​сопроводительная документация. ‹3 - person tresf; 09.09.2019
comment
Этот ответ почти у меня получился. В моем случае я объединяю свои java, jni и jre с помощью packr.jar для создания исполняемого файла My.app. Я получал. Исполняемый файл не имеет сбоев, связанных с включенной усиленной средой выполнения, во время нотариального заверения. Я решил эту проблему, подписав My.app с помощью кодового знака --options = runtime. Полная команда: codeign --force --deep --options = runtime -s ‹Мой идентификатор› /path/to/My.app. После подписания я смог создать установщик с помощью pkgbuild, подписать установщик с помощью productign и успешно нотариально заверить с помощью altool. - person NaderNader; 27.04.2020
comment
Добавлен новый раздел Runtime для тех, кто связывает JVM. Обратите внимание, что это немного отличается от остальной части учебника, поскольку предполагает .pkg, а не то, что я бы считал .app|.dmg конечным результатом, но я сделал все возможное, чтобы упомянуть об этом. Я также не тестировал это сам, поэтому мне придется поверить на слово НадерНадеру. : D - person tresf; 30.04.2020

В дополнение к приведенному выше ответу tresf, если ваше приложение находится в песочнице (и, возможно, даже если нет), тогда усиленная среда выполнения завершится с ошибкой при загрузке JVM. Чтобы обойти это, вам нужно будет добавить несколько ключей к своим правам при подписании. Ниже приведены необходимые записи о правах, скопированные из решения TAO ZHOU здесь: https://github.com/TheInfiniteKind/appbundler/issues/39

<key>com.apple.security.cs.allow-jit</key>
<true/>
<key>com.apple.security.cs.allow-unsigned-executable-memory</key>
<true/>
<key>com.apple.security.cs.disable-executable-page-protection</key>
<true/>
<key>com.apple.security.cs.disable-library-validation</key>
<true/>
<key>com.apple.security.cs.allow-dyld-environment-variables</key>
<true/>
person Sean Reilly    schedule 16.04.2019
comment
Не могли бы вы добавить несколько комментариев, чтобы объяснить, как каждая строка относится к JVM? Например, <key>com.apple.security.cs.allow-dyld-environment-variables</key>, эта строка связана с конкретным вариантом использования, когда ваше приложение предоставляет DYLD_LIBRARY_PATH во время выполнения? Если да, то не могли бы вы это прокомментировать? <key>com.apple.security.cs.allow-jit</key> это связано с тем, что некомпилированный код Java интерпретируется во время выполнения? Какие варианты использования вызвали необходимость в этом? Приветствуются любые подробности по каждому пункту. - person tresf; 17.04.2019
comment
Я не могу сказать, для чего все они предназначены, но я считаю, что большинство из них позволяет JVM выполнять JIT-компиляцию и записывать в исполняемую память, что, как я полагаю, обычно запрещает усиленная среда выполнения. Возможно, переменная среды DYLD нужна только для запуска на основе сценариев, но я не могу сказать наверняка. Наше приложение не вносит никаких изменений во время выполнения в путь к динамической библиотеке, поэтому я предполагаю, что это необходимо для включения процесса запуска JVM. Для справки, ошибка консоли перед добавлением этих строк была vm_map_enter: curprot не может быть записано + выполнено. провал - person Sean Reilly; 19.04.2019
comment
О боже. Спасибо! Пробовал все что угодно, и это был победитель. - person nevster; 30.06.2020
comment
Данная ссылка не работает - person BrainStorm.exe; 06.10.2020
comment
Ссылка теперь исправлена. К сожалению, он был сломан, когда мы перешли с bitbucket на github. - person Sean Reilly; 07.10.2020

Вот простой сценарий оболочки, который будет кодировать .so, .dylib и .jnilib в файле jar.

использование: codesign_jar_script.sh filename.jar

jar tf $1 | grep '\.so\|\.dylib\|\.jnilib'  > filelist.txt

IDENTITY="your_signing_identity"

echo $IDENTITY

while read f
do
    jar xf $1 $f
    codesign --force -s "$IDENTITY" -v $f
    jar uf $1 $f
    rm -rf $f
done < filelist.txt
person s6ch13    schedule 29.08.2020