Почему мое приложение Xamarin.Mac аварийно завершает работу, когда я включаю защищенную среду выполнения для его нотариального заверения?
Я разрабатываю приложение с использованием .NET Framework 4.5.2 в Visual Studio для Mac.
Apple добавила функции безопасности в свои последние версии для Mac, поэтому я хотел бы нотариально заверить приложение, чтобы Gatekeeper мог прочитать сгенерированный билет, а другие пользователи Mac, загружающие приложение, не получали предупреждения системы безопасности при запуске приложения.
После того, как Visual Studio создаст приложение благодаря Xamarin.Mac, я вручную запускаю несколько команд, чтобы подписать файл .app. Затем я создаю программу установки, создавая файл .dmg, содержащий файл .app. Затем я отправляю файл .dmg в службу нотариального заверения, которая создает отчет, содержащий две следующие строки.
"status": "Invalid",
"statusSummary": "Archive contains critical validation errors",
Команды для подписи .app следующие.
codesign -vvv --strict --force --timestamp --options runtime MyApp.app/Contents/Frameworks/MyFramework.framework/Versions/A/Resources/UpdateApp.app/Contents/MacOS/UpdateApp
codesign -vvv --strict --force --timestamp MyApp.app/Contents/Frameworks/MyFramework.framework/Versions/A/MyFramework
codesign -vvv --strict --force --timestamp MyApp.app/Contents/Library/loginItems/LoginApp.app
codesign -vvv --strict --force --timestamp --options runtime MyApp.app/Contents/PlugIns/FinderExt.appex
codesign -vvv --strict --force --timestamp MyApp.app
Двойной щелчок по файлу .app запускает приложение, чего я и хочу. Но в нотариальном отчете говорится
для двух следующих приложений
MyApp.dmg/MyApp.app/Contents/Library/loginItems/LoginApp.app/Contents/MacOS/LoginApp
MyApp.dmg/MyApp.app/Contents/MacOS/MyApp
Чтобы попытаться исправить эту проблему, я добавил
codesign -vvv --strict --force --timestamp --options runtime MyApp.app/Contents/Frameworks/MyFramework.framework/Versions/A/Resources/UpdateApp.app/Contents/MacOS/UpdateApp
codesign -vvv --strict --force --timestamp MyApp.app/Contents/Frameworks/MyFramework.framework/Versions/A/MyFramework
codesign -vvv --strict --force --timestamp --options runtime MyApp.app/Contents/Library/loginItems/LoginApp.app
codesign -vvv --strict --force --timestamp --options runtime MyApp.app/Contents/PlugIns/FinderExt.appex
codesign -vvv --strict --force --timestamp MyApp.app
Двойной щелчок по файлу .app по-прежнему запускает приложение, чего я и хочу. И в отчете нотариуса все еще говорится
The executable does not have the hardened runtime enabled.
но только для второго приложения, для которого команда не была изменена.
MyApp.dmg/MyApp.app/Contents/MacOS/MyApp
Поэтому мне казалось очевидным, что все, что мне нужно было сделать для успешного нотариального заверения заявки, — это точно так же модифицировать вторую команду.
codesign -vvv --strict --force --timestamp --options runtime MyApp.app/Contents/Frameworks/MyFramework.framework/Versions/A/Resources/UpdateApp.app/Contents/MacOS/UpdateApp
codesign -vvv --strict --force --timestamp MyApp.app/Contents/Frameworks/MyFramework.framework/Versions/A/MyFramework
codesign -vvv --strict --force --timestamp --options runtime MyApp.app/Contents/Library/loginItems/LoginApp.app
codesign -vvv --strict --force --timestamp --options runtime MyApp.app/Contents/PlugIns/FinderExt.appex
codesign -vvv --strict --force --timestamp --options runtime MyApp.app
И я был прав, потому что отчет нотариуса больше не показывает ошибок и генерируется тикет для Gatekeeper. Но когда я дважды щелкаю .app, чтобы запустить приложение, на этот раз оно не запускается. В консольном приложении Mac я вижу, что отчет о сбое генерируется со следующими строками.
Exception Type: EXC_BAD_ACCESS (SIGSEGV)
Exception Codes: KERN_INVALID_ADDRESS at 0x0000000000000000
Exception Note: EXC_CORPSE_NOTIFY
Я не понимаю, как я могу получить
Что у меня есть, так это то, что я могу либо запустить приложение, либо нотариально заверить его, и я хочу иметь и то, и другое, нотариально заверенное приложение, которое также можно запустить без сбоев, как это происходит перед командами.
Я прочитал две следующие страницы документации Apple, которую смог найти по этому вопросу, и я думаю, что следовал всем данным советам, но безуспешно в решении моей проблемы.
https://developer.apple.com/documentation/security/notarizing_macos_software_before_distribution
https://developer.apple.com/documentation/security/notarizing_macos_software_before_distribution/resolving_common_notarization_issues
Я пытался выяснить это некоторое время и пробовал несколько комбинаций команд и параметров. Что мне не хватает? Заранее спасибо за любой указатель.
NB: все
2 ответа
У меня была такая же проблема, и я решил ее.
Это тоentitlements.plist
добавить файл на этапе подписания Mac.
Откройте файл entitlements.plist в текстовом редакторе и добавьте
<key>com.apple.security.cs.allow-jit</key>
<true/>