Проблема карантина привратника с сертификатом

Наше приложение было подписано кодом. Наш сертификат Apple обновлен. Предыдущие версии нашего приложения работали очень хорошо.

Тем не менее, когда пользователи загружают DMG, на некоторых Mac приложение помещается в карантин, но для большинства пользователей это не так. Таким образом, некоторые пользователи могут открывать приложение, а другие получают «X.app не может быть открыт, потому что личность разработчика не может быть подтверждена».

К счастью, у меня есть 2 Мака с проблемой карантина, но мы не можем найти разницу между этими Маками и остальными. Кто-нибудь еще сталкивался с этой проблемой?

Ответы на вопрос(2)

е случаев. В моем случае это не так.

Помимо двух сообщений об ошибках привратника, о которых он упоминает, есть и третье, и это ответ на ваш вопрос:

".app не может быть открыт, потому что личность разработчика не может быть подтверждена."

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

Apple документирует это здесьhttps://developer.apple.com/library/content/technotes/tn2206/_index.html#//apple_ref/doc/uid/DTS40007919-CH1-TNTAG207

Если приложение использует @rpath или абсолютный путь для ссылки на динамическую библиотеку вне приложения, приложение будет отклонено Gatekeeper.

И они даже заявляют:

Ни код, ни инструмент spctl не покажут ошибку. Ошибка появится только в системном журнале.

Решение состояло в том, чтобы изменить сторонний фреймворк к чему-то стандартному как это:

$(inherited) @executable_path/../Frameworks @loader_path/Frameworks

вы можете быть немного озадачены тем, как работают карантин, подпись кода и гейткипер. Ошибка, которую вы видите, происходит от Gatekeeper и указывает на две разные (и независимые) вещи: 1) приложение помещено в карантин (что связано с тем, как оно было загружено, а не с тем, как оно подписано) и 2) оно не вошло в систему способ, который соответствует политике Gatekeeper, определенной в настройках безопасности и конфиденциальности. Позвольте мне объяснить эти две вещи более подробно.

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

Но не все методы сетевой загрузки будут применять атрибут карантина. Например, копирование файла через соединение для обмена файлами (например, AFP или SMB) с помощью Finder не помечает его как находящийся в карантине. Кроме того, инструменты командной строки, такие какcurl а такжеwget не будет применять карантин.

В вашем случае, когда вы загружаете файл .dmg, он помечается как помещенный на карантин; когда вы открываете его, атрибут распространяется на его содержимое, поэтому приложение также помечается как находящееся в карантине (а если вы копируете его в / Applications, атрибут карантина копируется вместе со всем остальным).

Чтобы проверить, находится ли файл в карантине, используйтеls [email protected] на это и искатьcom.apple.quarantine приписывать. Вполне возможно, что разница между разными компьютерами связана с тем, как был загружен образ диска и, следовательно, находятся ли приложения в карантине.

Когда вы открываете приложение на карантине, Gatekeeper проверяет, соответствует ли оно подсистеме политики безопасности вашего компьютера.это это где подпись кода входит в это. Вы можете просмотреть и изменить свою политику в Системных настройках -> Панель «Безопасность и конфиденциальность» -> вкладка «Общие» -> «Разрешить загрузку приложений из» или с помощьюspctl инструмент командной строки. Политика по умолчанию - разрешать помещать на карантин приложения из Mac App Store (т. Е. Подписанные ключами магазина приложений Apple) или от идентифицированного разработчика (т. Е. Подписанные ключом идентификатора разработчика, выданным Apple зарегистрированному разработчику).

Когда вы пытаетесь открыть приложение, которое находится на карантине, ине подписанный таким образом, чтобы соответствовать этой политике, вы получаете сообщение об ошибке, в котором говорится, что «X.app не может быть открыт, потому что он от неизвестного разработчика» или «... не был загружен из Mac App Store». Если это на карантине, ноделает В соответствии с политикой вы получите сообщение: «X.app - это приложение, загруженное из Интернета. Вы уверены, что хотите открыть его?» (с доступной кнопкой Open). Если он не помещен в карантин, проверка не выполняется, и приложение открывается напрямую.

Вы можете получить больше информации о подписании кода и статусе политики приложения сspctl --assess -vv /path/to/X.app (который скажет вам, соответствует ли он политике Gatekeeper) иcodesign -dvv /path/to/X.app.

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

 ColonelPanik15 июн. 2016 г., 19:27
$ spctl --assess -vv MyApp.app MyApp.app: принятый источник = источник идентификатора разработчика = идентификатор разработчика приложения: RT Ltd. (ABCDEF1234) $ codesign --verify --deep --verbose = 2 MyApp.app MyApp.app : действует на диске MyApp.app: удовлетворяет установленному требованию
 ColonelPanik15 июн. 2016 г., 19:21
Спасибо за подробный ответ. Все инструменты показывают, что приложение действительно подписано. Вот что я получаю, используя каждый из параметров (имя приложения и идентификатор команды были изменены) ...
 ColonelPanik17 июн. 2016 г., 18:49
Я получаю это: Sealed Resources version = 2 rules = 12 files = 294, и я считаю, что зависимости подписаны. Предупреждений нет. Мы находимся в середине нового цикла разработки, поэтому мы вернемся к проблеме с новым выпуском. Спасибо за вашу помощь, я добавил эту ссылку в закладки. Если мы это выясним тем временем, я выложу ответ.
 Gordon Davisson16 июн. 2016 г., 17:45
@ user3140551: У меня заканчиваются идеи, но вот еще пара: делаетcodesign -dvv показать "Sealed Resources version = 2"? Если нет, подпись в устаревшем формате. Кроме того, существуют ли какие-либо неподписанные / неправильно подписанные зависимости (платформы и т. Д.), Которые использует ваше приложение? Увидетьэтот вопрос для примера ...

Ваш ответ на вопрос