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

在 .NET SDK 7 及更高版本中,为应用生成一个 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 相同的默认权利

后续步骤