Заверение macOS Catalina и влияние на скачиваемые файлы и проекты .NET

Начиная с macOS Catalina (версия 10.15) все программное обеспечение, созданное после 1 июня 2019 года и распространяемое с идентификатором разработчика, должно быть заверено. Это требование относится к среде выполнения .NET, пакету SDK для .NET и программному обеспечению, созданному с помощью .NET. Эта статья описывает распространенные сценарии, с которыми вы можете столкнуться при заверении .NET и macOS.

Установка .NET

Установщики для .NET (среда выполнения и пакет SDK) были заверены с 18 февраля 2020 г. Более ранние версии не заверены. Вы можете вручную установить незаверенную версию .NET, скачав установщик и выполнив команду sudo installer. Дополнительные сведения см. в разделе Скачивание и установка вручную для macOS.

Собственный appHost

В пакете SDK для .NET 7 и более поздних версий для приложения создается собственный исполняемый файл Mach-O. Этот исполняемый файл обычно вызывается .NET, когда проект компилирует, публикует или выполняется с dotnet run помощью команды. Версия приложения, отличной от appHost, — это dll-файл, который может вызываться командойdotnet <app.dll>.

При локальном запуске пакет SDK подписывает apphost с помощью нерегламентированного подписывания, что позволяет приложению выполняться локально. При распространении приложения вам потребуется правильно подписать приложение в соответствии с рекомендациями Apple.

Вы также можете распространять приложение без приложения и полагаться на пользователей для запуска приложения с помощью dotnet. Чтобы отключить создание appHost , добавьте UseAppHost логическое значение параметра в файл проекта и задайте для него значение false. Кроме того, можно переключить использование appHost с помощью параметра -p:UseAppHost в командной строке для определенной команды dotnet:

  • Файл проекта

    <PropertyGroup>
      <UseAppHost>false</UseAppHost>
    </PropertyGroup>
    
  • Параметр командной строки

    dotnet run -p:UseAppHost=false
    

ПриложениеHost требуется при публикации автономного приложения, и его невозможно отключить.

Дополнительные сведения о параметре UseAppHost см. в разделе Свойства MSBuild для Microsoft.NET.Sdk.

Контекст appHost

Когда appHost включен в проекте и вы используете команду dotnet run для запуска приложения, оно вызывается в контексте appHost, а не узла по умолчанию (узлом по умолчанию является команда dotnet). Если appHost отключен в проекте, команда dotnet run запускает приложение в контексте узла по умолчанию. Даже если appHost отключен, публикация приложения в качестве автономного приводит к созданию исполняемого файла appHost, который применяется пользователями для запуска приложения. При запуске приложения с помощью dotnet <filename.dll> оно вызывается на узле по умолчанию — в общей среде выполнения.

При вызове приложения, использующего appHost, раздел сертификата, к которому обращается приложение, отличается от заверенного узла по умолчанию. Если приложение должно обращаться к сертификатам, установленным через узел по умолчанию, используйте команду dotnet run для запуска приложения из файла проекта или команду dotnet <filename.dll> для запуска приложения напрямую.

Дополнительные сведения об этом сценарии см. в разделе ASP.NET Core, macOS и сертификаты.

ASP.NET Core, macOS и сертификаты

.NET позволяет управлять сертификатами в цепочке ключей macOS с помощью класса System.Security.Cryptography.X509Certificates. В рамках обращения к цепочке ключей macOS удостоверение приложения используется в качестве первичного ключа при принятии решения о том, какой раздел следует рассматривать. Например, неподписанные приложения хранят секреты в неподписанном разделе, а подписанные приложения хранят свои секреты в разделах, доступ к которым есть только у них. Источник выполнения, вызывающий ваше приложение, решает, какой раздел следует использовать.

.NET предоставляет три источника выполнения: appHost, узел по умолчанию (команда dotnet) и пользовательский узел. Каждая модель выполнения может использовать разные удостоверения, подписанные или нет, а также имеет доступ к разным разделам в цепочке ключей. Сертификаты, импортированные в одном режиме, могут быть недоступны в другом. Например, заверенные версии .NET имеют подписанный узел по умолчанию. Сертификаты импортируются в защищенный раздел на основе его удостоверения. Эти сертификаты недоступны из созданного приложенияHost, так как appHost подписан нерегламентированным.

Другой пример: по умолчанию ASP.NET Core импортирует SSL-сертификат по умолчанию через узел по умолчанию. Приложения ASP.NET Core, использующие appHost, не будут иметь доступ к этому сертификату и получат сообщение об ошибке, когда .NET обнаружит, что сертификат недоступен. Это сообщение об ошибке содержит инструкции по устранению данной проблемы.

Если требуется общий доступ к сертификату, macOS предоставляет параметры конфигурации с помощью служебной программы security.

Дополнительные сведения об устранении неполадок, связанных с сертификатами ASP.NET Core, см. в разделе Применение протокола HTTPS в ASP.NET Core.

Права по умолчанию

Узел по умолчанию .NET (команда dotnet) имеет набор прав по умолчанию. Эти права необходимы для правильной работы .NET. Приложению могут понадобиться дополнительные права. В этом случае потребуется создать и использовать appHost, а затем добавить необходимые права локально.

Набор прав по умолчанию для .NET:

  • com.apple.security.cs.allow-jit
  • com.apple.security.cs.allow-unsigned-executable-memory
  • com.apple.security.cs.allow-dyld-environment-variables
  • com.apple.security.cs.disable-library-validation

Заверение приложения .NET

Если вы хотите, чтобы приложение выполнялось в macOS Catalina (версия 10.15) или более поздней версии, рекомендуется заверить его. Файл appHost, отправляемый вместе с приложением для заверения, должен использоваться по крайней мере с теми же правами по умолчанию для .NET Core.

Следующие шаги