Почему мое приложение 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

Чтобы попытаться исправить эту проблему, я добавил параметр для LoginApp.

      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/>
Другие вопросы по тегам