macOS Catalina Notarization 和對 .NET 下載和專案的影響

從 macOS Catalina (10.15 版) 開始,所有在 2019 年 6 月 1 日後建置的軟體都必須以開發人員識別碼來散發,才能進行記號。 此需求適用於 .NET 執行階段、.NET SDK,以及使用 .NET 建立的軟體。 本文說明您可能遇到的 .NET 常見案例和 macOS 標記法。

安裝 .NET

.NET (執行階段和 SDK) 的安裝程式自 2020 年 2 月 18 日起已進行記號。 先前發行的版本並未經過公證。 您可以先下載安裝程式,然後使用 sudo installer 命令,手動安裝 .NET 的非記號版本。 如需詳細資訊,請參閱下載並手動安裝 macOS

原生 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 相同的預設權利搭配使用。

下一步