Странность Mac DMG - подписывание и повреждение приложений

Мои настройки Gatekeeper: «Магазин приложений и идентифицированные разработчики»

У меня есть DMG с подписанным приложением.

Когда я монтирую DMG и запускаю его локально, он работает. когда я загружаю тот же DMG на наши серверы (через http), загружаю его (через http), монтирую и пытаюсь запустить приложение, я получаю всплывающее окно с сообщением, что мое приложение «повреждено и не может быть открыто. Вам следует переместить это в корзину.

Понятия не имею, что происходит. Как тот же файл может работать правильно локально, но при загрузке и загрузке он поврежден? Сервер в порядке, другие стороны в нашей компании загружают и скачивают приложения с него нормально.

Я что-то упускаю?


person JasonGenX    schedule 17.03.2014    source источник
comment
Вы проверили, что это действительно тот же файл и не поврежден ли он?   -  person rocky    schedule 18.03.2014


Ответы (6)


Выяснили проблему после множества попыток.

В моем случае: The Pop Message - приложение было повреждено из-за отсутствия библиотек. Я создал файл .app с помощью QT. Для создания dmg я использовал командный инструмент deploymacqt. Инструмент deploymacqt создает динамические библиотеки внутри .app, поэтому в основном, если мы кодируем перед созданием dmg, это изменение будет управлять знаком кода. Так что правильное исправление.

# Create dmg using 
    deploymacqt <yourapp.app> -dmg

# Open resulted dmg file, copy <yourapp.app> to different folder(let's say /Documents/<yourapp.app>)

# Codesign the /Documents/<yourapp.app> using 
    codesign --deep --force --verify --verbose --sign "Developer ID Application: <developerid>" <yourapp.app>

# Verify using
    codesign --verify --verbose=4 <yourapp.app>
 * you should see something like this
    <yourapp.app>: valid on disk
    <yourapp.app>: satisfies its Designated Requirement

# Now create again the dmg file using [dropdmg](https://c-command.com/dropdmg/) application, download, install dropdmg. set the cofiguration preferences with your developer id certificate in signing option.

# drag and drop <yourapp.app> to dropdmg app, wait for creation of dmg to complete. voila you have now successfully created dmg with proper developer id certification.

# verify resulted dmg again using   
     codesign --verify --verbose=4 <yourapp.dmg>
# you can also verify with gatekeeper
     spctl -a -t exec -vv <yourapp.dmg>

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

person virtplay    schedule 30.06.2017

Я рада, что вы нашли свою проблему. Если другие люди найдут этот пост в поисках поврежденных DMG, я хочу добавить еще одно вероятное решение:

В дополнение к подписанию пакета .app:

codesign -f -s "Developer ID Application: Your Dev ID Here" -v "Your App.app"

вы также должны подписать созданный DMG:

codesign -f -s "Developer ID Application: Your Dev ID Here" -v YourProgram.dmg

Я не ставил кавычки вокруг пути к файлу dmg, потому что вероятность того, что в имени dmg есть пробелы, меньше. Если вы это сделаете, не забудьте экранировать их в командной строке или заключить путь к файлу в кавычки.

person Kelly    schedule 21.07.2014

Я обнаружил проблему.

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

Это нарушает подпись и заставляет Mac нервничать и объявлять приложение поврежденным.

Потребовалось время, чтобы это обнаружить.

person JasonGenX    schedule 20.03.2014
comment
Почему загрузка DMG на ваши серверы изменила это? Разве в обоих случаях не будет записан один и тот же файл? (К вашему сведению - мы наблюдаем ту же проблему, но неясно, в чем причина) - person Chris R; 07.01.2015
comment
Не могли бы вы объяснить, как вы это исправили? (Что вы изменили в своем приложении?) - person ndominati2; 06.04.2015
comment
@ChrisR, я думаю, OS X применяет более строгие меры безопасности к файлам, загружаемым из Интернета. - person Hollis Waite; 26.02.2016
comment
@JasonGenX, так как вы это исправили, у кого-нибудь есть решение? - person virtplay; 29.06.2017

Откройте терминал и запустите:

sudo xattr -rd com.apple.quarantine /Applications/xxx.app

и "/Applications/xxx.app" ДОЛЖЕН быть путем к вашему приложению. Например, я не хочу запускать PDF Expert, а его путь - «/ Applications / PDF \ Expert.app». Затем я должен ввести это в моем терминале и ВВОД:

sudo xattr -rd com.apple.quarantine /Applications/PDF\ Expert.app"
person zy1996    schedule 05.11.2019

У моей проблемы была причина, похожая, но отличающаяся от той, что описана в сообщении @ JasonGenX.

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

Чтобы исправить это, я удалил эти файлы и запретил их создание или изменение, так что пакет .app никогда не должен изменяться сам по себе.


В частности, в моем комплекте приложений был код Python. Когда приложение запускало Python, оно компилировало импорт в .pyc файлы. Они были подписаны вместе с остальной частью набора приложений.

Когда я запустил .app перед созданием DMG, Python обновил и изменил эти .pyc файлы, чтобы они больше не проходили проверку подписи. Я проверил это, используя:

$ codesign --verify --verbose=4 my.app
[...]
my.app: a sealed resource is missing or invalid
file modified: /private/tmp/my.app/Contents/Resources/python-dist/chardet/codingstatemachine.pyc
file modified: /private/tmp/my.app/Contents/Resources/python-dist/chardet/euckrprober.pyc
[...etc...]

.App по-прежнему запускался на моем компьютере, потому что я создал его сам, поэтому ему доверяли. Но когда я загрузил и скачал DMG, он был помечен, чтобы указать, что он пришел из ненадежного источника и требовал проверки подписи.

Поскольку проверка подписи не удалась, MacOS сообщила, что пакет приложений был поврежден.


Исправление заключалось в том, чтобы удалить .pyc файлы из моих объединенных ресурсов Python и запустить Python как python -B, что дает указание не создавать .pyc файлы.

Я перестроил свой пакет .app без файлов .pyc, и Python больше не создает их, поэтому пакет .app остается неизменным.

person mrb    schedule 04.07.2018

У Ι была такая же проблема с приложением macOS, которое я создал и подписал. В моем проекте был проблемный png, который нельзя передать в архив. Когда я попытался проверить приложение через App Connect, я получил сообщение ниже.

введите описание изображения здесь

Я удалил проблемный png, я снова заархивировал приложение, заверил его, экспортировал с идентификатором разработчика, загрузил на свой сервер, загрузил с моего сервера и успешно запустил.

person Andreas Stokidis    schedule 07.03.2021