macOS Catalina 公证以及对 .NET 下载和项目的影响
自 macOS Catalina(版本 10.15)开始,所有在 2019 年 6 月 1 日之后生成并使用开发者 ID 扩散的软件都必须经过公证。 此要求适用于 .NET 运行时、.NET SDK 以及使用 .NET 创建的软件。 本文介绍了 .NET 和 macOS 公证可能会遇到的常见情况。
安装 .NET
自 2020 年 2 月 18 日起,.NET(运行时和 SDK)版本 3.1、3.0 和 2.1 的安装程序都已经过公证。 以前发布的版本没有经过公证。 首先下载安装程序,然后在下载的安装程序中使用 sudo installer
命令,即可手动安装未经公证的 .NET 版本。
Native appHost
编译应用后, 将生成一个 appHost(即本机 Mach-O 可执行文件)。 当项目编译、发布或使用 dotnet run
命令运行时,.NET 通常会调用此可执行文件。 应用的非 appHost 版本是可由 dotnet <app.dll>
命令调用的 dll 文件。
在本地运行时,SDK 使用即席签名对 apphost 进行签名,这样应用就可以在本地运行。 分发应用时,需要根据 Apple 指导正确签署应用。
还可以在没有 apphost 的情况下分发应用,并依赖用户使用 dotnet
来运行应用。 若要关闭 appHost 生成,请在项目文件中添加 UseAppHost
布尔设置,并将其设置为 false
。 还可以在运行的特定 dotnet
命令的命令行上通过 -p:UseAppHost
参数切换 appHost 的启用状态:
项目文件
<PropertyGroup> <UseAppHost>false</UseAppHost> </PropertyGroup>
命令行参数
dotnet run -p:UseAppHost=false
发布自包含应用时需要 appHost,且不能禁用它。
有关 UseAppHost
设置的详细信息,请参阅 Microsoft.NET.Sdk 的 MSBuild 属性。
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,可以使用 System.Security.Cryptography.X509Certificates 类在 macOS Keychain 中管理证书。 在决定要考虑哪个分区时,对 macOS Keychain 的访问将使用应用程序标识作为主键。 例如,未签名的应用程序会将机密存储在未签名分区中,而已签名应用程序会将其机密存储在仅能由它们访问的分区中。 要使用的分区取决于调用应用的执行源。
.NET 提供三个执行源:appHost、默认主机(dotnet
命令)和自定义主机。 每个执行模型都可能具有不同的标识(已签名或未签名),并可以访问 Keychain 中的不同分区。 通过一种模式导入的证书可能不能通过另一种模式访问。 例如,已公证版本的 .NET 具有已签名的默认主机。 根据证书的标识将证书导入到安全分区中。 由于 appHost 是即席签名的,因此无法从生成的 appHost 访问这些证书。
再举一例,默认情况下,ASP.NET Core 通过默认主机导入默认 SSL 证书。 使用 appHost 的 ASP.NET Core 应用程序将不能访问此证书,并且当 .NET 检测到无法访问该证书时,将收到错误消息。 该错误消息中会提供关于如何解决此问题的说明。
如果证书共享是必需的,macOS 会提供带有 security
实用工具的配置选项。
如需详细了解如何解决 ASP.NET Core 证书问题,请参阅在 ASP.NET Core 中强制执行 HTTPS。
默认权利
.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 相同的默认权利。