Защищенная среда выполнения для Java и Mojave - PullRequest
0 голосов
/ 21 октября 2018

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

В последнее время Apple предупреждает разработчиков:

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

После прочтения нотариально заверенных документов apple предупреждает разработчиков :

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

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

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

Ответы [ 2 ]

0 голосов
/ 17 апреля 2019

В дополнение к ответу tresf выше, если ваше приложение помещено в «песочницу» (и, возможно, даже если нет), то усиленная среда выполнения не будет работать при загрузке JVM.Чтобы обойти это, вам нужно добавить некоторые ключи к вашим правам при подписании.Ниже перечислены необходимые права доступа, скопированные из решения TAO ZHOU здесь: https://bitbucket.org/infinitekind/appbundler/issues/39/build-with-hardened-runtime

<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/>
0 голосов
/ 29 ноября 2018

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

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

Подписание кода

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

    • Сертификаты , Идентификаторы и профили , (Нажмите раскрывающийся список «iOS, tvOS, watchOS»)) macOS , Приложение ID разработчика .(может также сказать «с кекстом»).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  -u  -f 

    Что может выглядеть примерно так:

    xcrun altool --eval-app --primary-bundle-id com.domain.appname -u john@domain.com -f appname.pkg
  • Вам будет предложено ввести пароль для вашего разработчика Apple ( НЕ пароль, который вы используете для входа в свою учетную запись.Mac). Редактировать: Так как двойной фактор был обязательным, вам нужно создать пароль приложения для этого шага!

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

    RequestUUID = a1b2c3d4e5-a1b2-a1b2-a1b2-a1b2c3d4e5f6
  • Периодически проверять состояние этогоуникальный идентификатор, чтобы увидеть, был ли он одобрен или отклонен.
    xcrun altool --eval-info a1b2c3d4e5-a1b2-a1b2-a1b2-a1b2c3d4e5f6 -u john@domain.com
  • Если отказать, они не скажут вам напрямую, почему, вы должны проанализировать ответ 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
...