С выпуском macOS 10.14.5 Apple добавила обязательную процедуру нотариального заверения приложений перед их распространением.
Я хотел бы рассказать вам, что это такое и какие трудности возникли с этим обновлением при разработке на Electron.js.
Введение
Спустя 2 года после бума Electron.js все горячие холивары о том, насколько он плох и зачем он нужен, утихли.Давайте не будем разжигать их в комментариях.
Спасибо.
В нашем проекте для сборки приложения используется электронный конструктор, но для электронного упаковщика эта процедура будет примерно такой же.
Сам проект представляет собой лаунчер для облачных игр, через который запускается нативный клиент для доступа к удаленному компьютеру.
Подписание заявки с помощью электрон-билдера не выглядит сложным, но для полноты картины я кратко расскажу об этой процедуре.
Если у вас нет проблем с подписанием приложения, вы можете пропустить эту главу.
Подписание приложения
Чтобы подписать приложение, нам необходимо экспортировать сертификаты из учетной записи разработчика Apple. Нам понадобится:- Заявка на получение идентификатора разработчика
- Установщик идентификатора разработчика
- *Приложение стороннего разработчика для Mac и установщик стороннего разработчика для Mac (если вы планируете опубликовать приложение в AppStore)
Сертификаты должны быть собраны в один файл.
Для этого добавьте их в связку ключей (2 клика по сертификату).
Затем перейдите в связку ключей, выберите необходимые сертификаты и нажмите «Экспортировать элементы» в контекстном меню.
После экспорта получаем один файл с расширением .
p12.
После получения файла сертификата добавьте следующие записи в переменные среды
- CSC_LINK (путь к файлу сертификата .
p12)
- CSC_KEY_PASSWORD (пароль доступа к сертификату)
Добавление этих записей позволяет вам точно определить сертификаты, которые вы хотите использовать для подписи.
После этих операций вы можете начать процесс сборки, и все должно пройти гладко.
Все работало без проблем до выхода macOS 10.14.5.
Что изменилось с выходом macOS 10.14.5
Небольшое отступление.Пока ночью выполнял финальную работу над новым патчем, я решил оставить сборку серийной версии до утра.
Заметив, что на macOS пришло обновление, я запустил его и лег спать.
На следующее утро я с удивлением увидел, что сборка крашится из-за незнакомой ошибки при подписании приложения — «Ненотаризованный идентификатор разработчика».
Не откладывайте на завтра то, что можно сделать сегодня.Бенджамин Франклин
Суть проблемы
Начиная с macOS 10.14.5, Apple ввела обязательную процедуру нотариального заверения.Первая статья Apple об этом была в 2018 году, но именно с этим обновлением эта процедура стала обязательной.
Как она выглядит. Вы создаете приложение -> отправляете его на сервер Apple -> Apple проверяет его -> возвращает статус успешной проверки -> выполняется команда установки штампа проверки.
Для разработчиков Xcode вам просто нужно поставить галочку в поле нотариального заверения.
Процесс заверения собранного приложения также можно выполнить с помощью команды в терминале.
$ xcrun altool --notarize-app --primary-bundle-id "com.example.ote.zip" --username "AC_USERNAME" --password "@keychain:AC_PASSWORD" --file OvernightTextEditor_11.6.8.zip
- первичный-bundle-id — BundleID приложения
- имя пользователя - вход пользователя в систему разработчик.
apple.com
- пароль — «пароль приложения».
Вы можете создать его в личном кабинете appleid.apple.com под учетной записью разработчика.
Привратник отвечает за проверку безопасности приложения.
Это он сломал сборку приложения на электрон-конструкторе.
Как выглядел процесс сборки электронного строителя
После создания приложения в файле .app приложение было подписано с помощью утилиты Electron-OSX-Sign. После подписания сертификатом начался процесс проверки приложения привратником.
Но с выходом обновления гейткипер начал проверять правильность нотариального заверения приложения, что не позволило успешно завершить процедуру подписания приложения.
Патч для возможностей нотариального заверения
Пользователь Github Каллин Довольно оперативно предложил зафиксировать решение, с добавлением в настройки двух новых параметров.Первый — «gatekeeperAssess» — отключает проверку сборки после подписания, а второй — «sign» — отключает подпись установочного файла (dmg) сертификатом.
Этот коммит был включен в выпуск Electron-Builder 20.43.0. Для самого процесса нотариального заверения в Electron-Userland есть модуль Electron-Notarize, выполняющий эту задачу, вам просто нужно написать небольшой скрипт и запустить его с помощью хука afterSign.
Процедура подписания и нотариального заверения заявления
Первоначально вам необходимо убедиться, что у вас установлена электронная сборка версии > =20.43.0, и установить пакет электронного нотариального заверения.
Добавим две записи в переменные среды:
- appleId - вход разработчик.
apple.com
- appleASP — «пароль приложения», который можно создать в вашей личной учетной записи.
Теперь создадим скрипт нотариального заверения, который будет выполняться после подписания заявления.
const notarize = require('electron-notarize').
notarize; module.exports = async (context) => { const { electronPlatformName } = context; if (electronPlatformName === 'darwin') { try { console.log('Try notarize app'); await notarize({ appBundleId: 'APP_BUNDLE_ID', appPath: '.
/dist/mac/APP_NAME.app',
appleId: process.env.appleId,
appleIdPassword: process.env.appleASP,
});
console.log('Success notarize');
} catch (err) {
console.log(err);
}
}
};
Сохраняем его в удобном для вас месте.
Также для корректного нотариального заверения нам потребуется определить права доступа к системным ресурсам нашего приложения.
Для этого создайте файл build/entitlements.mac.inherit.plist. <Эxml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" " http://www.apple.com/DTDs/PropertyList-1.0.dtd ">
<plist version="1.0">
<dict>
<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.allow-dyld-environment-variables</key>
<true/>
<key>com.apple.security.cs.disable-library-validation</key>
<true/>
<key>com.apple.security.cs.disable-executable-page-protection</key>
<true/>
<key>com.apple.security.cs.debugger</key>
<true/>
<key>com.apple.security.automation.apple-events</key>
<true/>
</dict>
</plist>
Содержимое файла в моем случае.
Для вас может быть другая конфигурация.
Для Electron.js требуется — com.apple.security.cs.allow-unsigned-executable-memory. Теперь давайте обновим настройки в package.json. В разделе для macOS:
- GatekeeperAssess (отключает проверку приложения на стороне электронного знака OSX)
- HardenedRuntime (позволяет создать список разрешений безопасности и доступа к системным ресурсам)
- entitlements (путь к файлу прав доступа для нашего приложения)
- afterSign (путь к скрипту нотариального заверения, который будет запущен после подписания приложения)
Это может показаться немного медленным, но передача файла на сервер Apple и ожидание ответа занимает некоторое время (от 3 до 10 минут).
Статус нотариального заверения можно посмотреть в терминале, выполнив команду: $ xcrun altool --notarization-history 0 -u $appleId -p $appleASP
Ответ будет представлен в таблице.
Поле статуса может иметь значение «обрабатывается», «утверждено», «недействительно».
Если статус «недействителен», вы можете использовать номер запроса, чтобы узнать, что именно пошло не так.
$ xcrun altool --notarization-info "RequestUUID" -u $appleId
Вот и весь процесс подписания и нотариального заверения.
Надеюсь, вы найдете мою статью полезной.
Спасибо.
Небольшое дополнение
При отправке приложения на тестирование был обнаружен интересный глюк.Приложение, полученное через Telegram, просто отказывалось запускаться.
При просмотре логов было обнаружено, что приложение было помещено в карантин Telegram. По какой причине и как это произошло, я не смог найти ответа.
При отправке файла через Яндекс.
Диск (или любым другим способом загрузки через браузер) такой проблемы не возникает.
Полезные ссылки
- электронно-нотариально заверенный репозиторий
- Статья Apple о нотариальном заверении приложений
- Статья Каллина о процессе нотариального заверения, я нашел ее, когда закончил писать свою
-
Ит-Специалисты.
19 Oct, 24 -
Китай Проведет Чистку Интернета
19 Oct, 24