Я разрабатываю приложение для Mac с Qt5, поэтому вне Xcode. Я хочу, чтобы GateKeeper разрешил моему приложению запускаться на компьютерах клиентов, а не выдавать сообщение "Невозможно открыть, потому что предупреждение о неспособности разработчика не может быть подтверждено".
Я успешно подписал приложение с цифровой подписью, но GateKeeper по-прежнему приходит с этой жалобой. У меня есть сертификат разработчика Apple (я агент команды), и моя цепочка ключей говорит, что она действительна. Я также установил два корневых сертификата Apple.
Я использую утилиту командной строки codesign
для цифровой подписи всех двоичных файлов внутри папки приложения и, кроме того, я сам подписываю папку приложения непосредственно. Во всех случаях реакция кодазначна и не содержит ошибок. С кодовым кодом я могу проверить, действительно ли все двоичные файлы подписаны, работает
$ codesign --verify --deep --verbose=2 MyApp.app
показывает, что все двоичные файлы проверяются. И кроме того, он сообщает:
MyApp.app: действует на диске
MyApp.app: удовлетворяет его назначенное требование
Продолжительность:
$ codesign -v --verbose=4 --display MyApp.app
дает
Исполняемый файл =/Пользователи/xxx/trunk/yyy/deploy/release/MyApp.app/Содержание/MacOS/MyApp
Идентификатор = aaaa.MyApp
Формат = пакет с Mach-O тонким (x86_64)
CodeDirectory v = 20200 size = 12461 flags = 0x0 (none) хэши = 616 + 3 location = embedded
Тип хэша = размер sha1 = 20
CDHash = d1c12c783dac0e8d9a2b749fb896b11558cec8b6
Размер подписи = 8532
Полномочия = Идентификатор разработчика: XXXXX
Полномочия = Центр сертификации идентификатора удостоверения личности
Полномочия = Apple Root CA
Временная метка = 29 jul. 2015 12; 04: 40
Записи Info.plist = 8
TeamIdentifier = YYYYY
Версия Sealed Resources = 2 правила = 12 файлов = 10
Внутренние требования count = 1 размер = 180
который кажется ОК.
Выполнение
$ spctl -a -t exec -vv MyApp.app
для всех двоичных файлов дает результат
MyApp.app: принят
source = ID разработчика
origin = Идентификатор разработчика Приложение: XXXX
который также выглядит ОК
Запуск контрольной подписи инструмента командной строки XCode
в приложении или в двоичных файлах внутри папки приложения:
$ ./check-signature /Users/xxx/trunk/yyy/release/MyApp.app
дает результат
(c) 2014 Apple Inc. Все права защищены.
ДА
который во всех случаях является искомым результатом.
Но GateKeeper по-прежнему не принимает приложение и жалуется на то, что разработчик не может быть подтвержден.
[добавлено автором в пятницу 17 июля 2015 г.]
Думаю, я нашел проблему. Я не знаю, является ли это функцией или ошибкой OSX. Мне многое помогло stackoverflow вопрос 19551298.
Всякий раз, когда файл загружается из Интернета, он получает связанный с ним расширенный атрибут файла com.apple.quarantine. При двойном щелчке по этому загруженному файлу в Finder, GateKeeper имеет две возможности:
-
Когда файл не подписан, он выдает сообщение "Неизвестный разработчик и т.д."
-
Когда файл имеет цифровую подпись, он выдает сообщение "Разработчик не может быть подтвержден и т.д."
В обоих случаях MessageBox имеет только одну кнопку, кнопку OK. Когда эта кнопка нажата, ничего не происходит, кроме закрытия MessageBox.
Если расширенный атрибут удален (xattr -d), приложения запускаются, подписываются или нет.
Поведение отличается от того, когда приложения запускаются щелчком правой кнопки мыши в Finder в приложении, а затем нажмите "Открыть" действие меню. Снова появляется один из двух сообщений, но теперь добавлена дополнительная кнопка, позволяющая пользователю открывать приложение в любом случае. Опять же, разница между подписанными и не подписанными - это сообщение "Неизвестно" или "Не подтверждено". Я не ожидаю, что мои клиенты смогут рассказать о различиях. В результате подписание приложения является бесполезным упражнением.
На основе Документация поддержки Apple Я ожидал другого, гораздо более приятного поведения GateKeeper при двойном щелчке загруженного приложения (возможно, документации устарел или я его неправильно понял):
-
Если приложение подписано, GateKeeper должен показать MessageBox с "Загруженным из Интернета и т.д." и кнопкой "Продолжить?"
-
если приложение не подписало MessageBox с одной кнопкой OK и текстом "Неизвестный разработчик и т.д."