macOS: нотариально заверять в скрипте? - PullRequest
4 голосов
/ 04 июля 2019

Поскольку кодирование и архивирование с помощью XCode отнимает много времени, скучно и проблематично, я всегда кодировал, архивировал и отправлял свое приложение для Mac с подписью ID разработчика, используя инструменты командной строки xcodebuild, codesign и т. Д. по моему собственному сценарию. Нотариальное заверение выглядит так, как будто это будет большая боль. Можно ли добавить нотариальное заверение в мой скрипт?

Ответы [ 2 ]

4 голосов
/ 04 июля 2019

Да.К сожалению, официальный ответ оставляет слабые стороны, например, этот важный лакомый кусочек от Куинна "Эскимос" .Вот как это сделать:

Одноразовые настройки

Получить пароль для приложения

Определите имя для своего "приложения" для нотариального заверения приложений.Я использую имя моего скрипта доставки товара, SSYShipProduct.pl, потому что это «приложение», которое будет использовать этот пароль.Мы будем называть любое имя, которое вы составляете, как ваше-нотариальное имя .

. Перейдите к https://appleid.apple.com/account/manage,, прокрутите к Безопасность > Приложение-Определенный пароль и сгенерируйте Специфичный для приложения пароль для приложения с именем your-notarizing-name .Скопируйте пароль, который он вам дает.Мы назовем это app-specific-password .

Добавьте специфичный для приложения пароль к вашей цепочке ключей MacOS

Запустите эту команду, чтобы добавить только что созданный пароль к вашему.цепочка для ключей:

security add-generic-password -a "your-apple-ID-email" -w "app-specific-password" -s "your-notarizing-name"

Параметр -s - это имя, которое этот элемент будет иметь в вашей цепочке для ключей.Я думаю, что вы могли бы на самом деле использовать другое имя, но, на мой взгляд, имеет смысл использовать и здесь your-notarizing-name.

Вы можете убедиться, что это сработало, выполнив поиск в приложении Keychain Access ,Однако имейте в виду, что новые элементы не перечислены в Доступ к цепочке для ключей до тех пор, пока вы не закроете и не запустите его.

Возможно, получите соответствующего itc-провайдера

Если ваш Apple ID связан с более чем одной командой Apple Developer Connection (например, если вы выполняете контрактную работу), вам потребуется itc_provider группы, для которой это приложение должно быть заверено нотариально.

Чтобы найти itc_provider вашей команды, выполните эту команду:

/Applications/Xcode.app/Contents/Applications/Application\ Loader.app/Contents/itms/bin/iTMSTransporter -m provider -u "your-apple-ID-email" -p "app-specific-password"

Прокрутите до конца вывода, напечатанного этой командой, ипосмотрите на таблицу провайдера .Скопируйте короткое имя нужной команды.Мы будем называть это «developer-team-itc-provider».

Для каждой отправки (Scriptable!)

Если вы подписываете компоненты своего приложения с помощью инструмента командной строки /usr/bin/codesign, каждыйДля вызова CoSignSign должен иметь следующий новый параметр аргумента, который сообщает CodeSign для подписи с так называемым усиленным временем выполнения :

 `--options runtime`

И наоборот, если ваше приложение подписано в XCode, вы должныустановите параметр сборки Защищенная среда выполнения , доступный в Xcode 10 или более поздней версии, на Да во всех целевых объектах исполняемых компонентов.

Кроме этого, ваш сценарий должен создать сборкувашего приложения в конфигурации выпуска и кодируйте его, как и в дни до нотариального заверения.

Загрузка в службу нотариуса Apple

Затем ваш сценарий должен заархивировать ваше приложение в .zip или .dmg.Обратите внимание, что это промежуточный файл, который будет загружен только в службу Apple Notary, но не отправлен.

Затем ваш сценарий должен составить значение основного идентификатора пакета , которое будет вашим приложением.идентификатор пакета с добавлением .zip или .dmg.Пример: your-pbid-value = com.mycompany.YourApp.zip.

В дальнейшем ваш скрипт будет использовать altool, то есть имя Apple для Application Loader Tool .

Затем ваш скрипт должен выполнить эту команду, чтобы получить ваш .zip или .dmg нотариально заверенный:

Редактировать 2019-07-09.Пожалуйста, прочитайте первый комментарий ниже @khuttun относительно добавления аргумента --output-format для получения структурированного вывода.

/usr/bin/xcrun altool --notarize-app --primary-bundle-id "your-pbid-value" --username "your-apple-id-email" --password "@keychain:your-notarizing-name" -itc_provider "developer-team-itc-provider" --file /path/to/YourApp.zip/or/YourApp.dmg

(Обратите внимание, что в приведенной выше командекак ни странно, всем именам аргументов предшествуют две черты, за исключением того, что перед -itc_provider стоит только одна черта. Также, если используемый вами язык сценариев интерполирует символы @ в строках, закодируйте его, чтобы предотвратить интерполяцию @keychain).

Через минуту или около того, xcrun выйдет и напечатает результаты stderr, которые включают Запрос UUID .Пример:

No errors uploading '/path/to/YourApp.zip'.
RequestUUID = 605e0ae5-9106-4dd6-8e85-b3a9b3f12c0b

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

В этом сценарии требуется значение RequestUUID из вышеприведенного вывода.Было бы неплохо, если бы этот результат был в документированном формате, в некотором формате JSON или чем-то еще, но, к сожалению, это не так, поэтому все, что мы можем сделать, - это попытаться проанализировать RequestUUID надежным способом, который, как мы надеемся, будет ориентирован на будущее, используянаше лучшее мнение.Вот как я делаю это в Perl, проверяя стандартный вывод в случае, если stderr возвращает с пустыми руками:

$stderr =~ m/equestUUID[\s=]+([^\s]+)/;
my $requestUuid = $1;
if (length($requestUuid) < 10) {
    $stdout =~ m/equestUUID[\s=]+([^\s]+)/;
    $requestUuid = $1;
}

Ожидание в цикле ответа Apple

Ваш сценарий может затем приставать к серверу Apple дляваши окончательные результаты, выполнив эту команду в цикле вместе с некоторым сном:

/usr/bin/xcrun altool --notarization-info <Request UUID> --username "your-apple-id-email" --password "@keychain:your-notarizing-name"

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

No errors getting notarization info.
RequestUUID: 885aeaa1-743f-4462-97d9-f79a0f679bc4
Date: 2019-07-01 07:14:36 +0000
Status: in progress
LogFileURL: (null)

Обычно через несколько минут (Apple говорит, «должно быть меньше часа», но у меня было время 1:35 и 3:30 часов: минутво второй половине дня 2019-Jul-04) ваш сценарий получит другой результат, снова в stderr, что-то вроде этого:

No errors getting notarization info.
RequestUUID: 885aeaa1-743f-4462-97d9-f79a0f679bc4
Date: 2019-07-01 07:14:36 +0000
Status: in progress
LogFileURL: (null)
Status Code: 0
Status Message: Package Approved

И еще через несколько секунд, снова в stderr, что-то вроде этого:

No errors getting notarization info.
RequestUUID: 885aeaa1-743f-4462-97d9-f79a0f679bc4
Date: 2019-07-01 07:14:36 +0000
Status: success
LogFileURL: https://osxapps-ssl.itunes.apple.com/. . .
Status Code: 0
Status Message: Package Approved

Таким образом, в каждой итерации цикла ваш скрипт должен анализировать значение Status и выходить из цикла, когда он становится чем-то отличным от in progress, но опять же некоторые документыприветствуется Apple.

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

Проверьте файл журнала Apple

Затем ваш сценарий должен проанализировать значение, следующее за LogFileURL:, потому что, даже если заверение нотариуса завершится успешно, файл журнала, созданный Apple, может содержать предупреждения.Чтобы получить файл журнала, ваш скрипт должен, конечно,

curl <LogFileURL-Value>

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

Сшивание тикета в ваше приложение

Этот шаг довольно прост ...

xcrun stapler staple /path/to/YourApp.app

Запуск этой команды добавит в пакет вашего приложения новый файл: YourApp.app/Contents/CodeResources.Это, по-видимому, ваш нотариальный билет .Обратите внимание, что этот файл является дополнением к файлу YourApp.app/Contents/_CodeSignature/CodeResources, который все еще там, и содержит кодовую подпись, такую ​​же, как в дни перед нотариальным заверением.

Проверьте сшивание билетов

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

spctl -a -v /path/to/YourApp.app

Результат в stderr должен быть

/path/to/YourApp.app: accepted
source=Notarized Developer ID

, что совпадает с результатом донотариальное заверение, кроме вставки нотариально .Сложные сценарии проанализируют этот stderr и прервут доставку, если вышеуказанные слова не будут обнаружены.

Zip and Ship

Теперь, когда билет добавлен, ваш сценарий может снова заархивировать или перенаправить ваш .app, но на этот раз отправь.

0 голосов
/ 06 июля 2019

Вот пример автоматического нотариуса, который я написал для RawTherapee.Сначала мы заверяем приложение:

https://github.com/Beep6581/RawTherapee/blob/6fa533c40b34dec527f1176d47cc6c683422a73f/tools/osx/macosx_bundle.sh#L225-L250

Затем мы заверяем dmg:

https://github.com/Beep6581/RawTherapee/blob/6fa533c40b34dec527f1176d47cc6c683422a73f/tools/osx/macosx_bundle.sh#L283-L307

Учетные данные нотариуса передаются через cmakeкомандная директива

-DNOTARY="--username user@mail.com --password abcd-efgh-ijkl-mnop"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...