notarizzazione di macOS Catalina e l'impatto sui download e sui progetti .NET
A partire da macOS Catalina (versione 10.15), tutti i software compilati dopo il 1° giugno 2019 e distribuiti con ID Sviluppatore devono essere notati. Questo requisito si applica al runtime .NET, a .NET SDK e al software creato con .NET. Questo articolo descrive gli scenari comuni che possono verificarsi con la notarizzazione di .NET e macOS.
Installazione di .NET
I programmi di installazione per .NET (runtime e SDK) sono stati notarizzati dal 18 febbraio 2020. Le versioni rilasciate in precedenza non sono autenticate. È possibile installare manualmente una versione non autenticata di .NET scaricando prima il programma di installazione e quindi utilizzando il comando sudo installer
con il programma di installazione scaricato.
AppHost nativo
Quando l'app viene compilata, viene generato un file eseguibile Mach-O nativo, ovvero appHost. Questo eseguibile viene in genere richiamato da .NET quando il progetto viene compilato, pubblicato o eseguito con il comando dotnet run
. La versione non appHost dell'app è un file DLL che può essere richiamato dal comando dotnet <app.dll>
.
Quando viene eseguito in locale, l'SDK firma l'apphost usando la firma ad hoc, che consente l'esecuzione locale dell'app. Quando si distribuisce l'app, è necessario firmare correttamente l'app in base alle indicazioni apple.
È anche possibile distribuire l'app senza apphost e affidarsi agli utenti per eseguire l'app usando dotnet
. Per disattivare la generazione di appHost, aggiungere l'impostazione booleana UseAppHost
nel file di progetto e impostarla su false
. È anche possibile attivare o disattivare appHost con il parametro -p:UseAppHost
nella riga di comando per il comando dotnet
specifico eseguito:
File di progetto
<PropertyGroup> <UseAppHost>false</UseAppHost> </PropertyGroup>
Parametro della riga di comando
dotnet run -p:UseAppHost=false
Un appHost è necessario quando si pubblica l'app autonoma e non è possibile disabilitarla.
Per altre informazioni sull'UseAppHost
impostazione, vedere Proprietà di MSBuild per Microsoft.NET.Sdk.
Contesto dell'appHost
Quando appHost è abilitato nel progetto e si usa il comando dotnet run
per eseguire l'app, l'app viene richiamata nel contesto di appHost e non dell'host predefinito (l'host predefinito è il comando dotnet
). Se appHost è disabilitato nel progetto, il comando dotnet run
esegue l'app nel contesto dell'host predefinito. Anche se appHost è disabilitato, la pubblicazione dell'app come indipendente genera un eseguibile appHost e gli utenti usano tale eseguibile per eseguire l'app. L'esecuzione dell'app con dotnet <filename.dll>
richiama l'app con l'host predefinito, ovvero il runtime condiviso.
Quando un'app che usa appHost viene richiamata, la partizione del certificato a cui si accede dall'app è diversa dall'host predefinito notarizzato. Se l'app deve accedere ai certificati installati tramite l'host predefinito, usare il comando dotnet run
per eseguire l'app dal file di progetto oppure usare il comando dotnet <filename.dll>
per avviare direttamente l'app.
Altre informazioni su questo scenario sono disponibili nella sezione ASP.NET Core e macOS e i certificati.
ASP.NET Core, macOS e certificati
.NET consente di gestire i certificati nel Keychain macOS con la classe System.Security.Cryptography.X509Certificates. L'accesso al keychain macOS usa l'identità delle applicazioni come chiave primaria quando si decide quale partizione prendere in considerazione. Ad esempio, le applicazioni non firmate archiviano i segreti nella partizione non firmata, ma le applicazioni firmate archiviano i segreti solo nelle partizioni a cui possono accedere. L'origine dell'esecuzione che richiama l'app decide quale partizione usare.
.NET fornisce tre origini di esecuzione: appHost, l'host predefinito (il comando dotnet
) e un host personalizzato. Ogni modello di esecuzione può avere identità diverse, firmate o non firmate e ha accesso a partizioni diverse all'interno del Keychain. I certificati importati da una modalità potrebbero non essere accessibili da un altro. Ad esempio, le versioni notarizzate di .NET hanno un host predefinito firmato. I certificati vengono importati in una partizione sicura in base alla relativa identità. Questi certificati non sono accessibili da un appHost generato, perché appHost è firmato ad hoc.
Un altro esempio, per impostazione predefinita, ASP.NET Core importa un certificato SSL predefinito tramite l'host predefinito. ASP.NET applicazioni Core che usano un appHost non avranno accesso a questo certificato e riceveranno un errore quando .NET rileva che il certificato non è accessibile. Il messaggio di errore fornisce istruzioni su come risolvere il problema.
Se è necessaria la condivisione dei certificati, macOS offre opzioni di configurazione con l'utilità security
.
Per altre informazioni su come risolvere i problemi relativi ai certificati ASP.NET Core, vedere Applicare HTTPS in ASP.NET Core.
Entitlement predefiniti
L'host predefinito di .NET (il comando dotnet
) ha un set di diritti predefiniti. Questi diritti sono necessari per il corretto funzionamento di .NET. È possibile che l'applicazione richieda diritti aggiuntivi, nel qual caso sarà necessario generare e usare un appHost e quindi aggiungere i diritti necessari in locale.
Set predefinito di entitlement per .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
Notarizzare un'app .NET
Se si vuole che l'applicazione venga eseguita in macOS Catalina (versione 10.15) o successiva, è consigliabile notarizzare l'app. L'appHost inviato con l'applicazione per la notarizzazione deve essere usata con almeno gli stessi entitlement predefiniti per .NET Core.