Creare e usare gli assembly con nome sicuro

Un nome sicuro è costituito dall'identità dell'assembly, corrispondente al nome semplice in formato testo, al numero di versione e alle informazioni sulle impostazioni cultura eventualmente disponibili, nonché da una chiave pubblica e da una firma digitale. Questo nome viene generato da un file di assembly usando la chiave privata corrispondente. Il file di assembly contiene il manifesto dell'assembly, che include i nomi e gli hash di tutti i file che costituiscono l'assembly.

Avviso

Non usare i nomi sicuri per la sicurezza, poiché forniscono solo un'identità univoca.

Gli assembly con nome sicuro possono usare solo tipi da altri assembly con nome sicuro. In caso contrario, l'integrità dell'assembly con nome sicuro risulterebbe compromessa.

Nota

Anche se .NET Core supporta assembly con nome sicuro e tutti gli assembly nella libreria .NET Core sono firmati, la maggior parte degli assembly di terze parti non richiede nomi sicuri. Per altre informazioni, vedere Firma con nome sicuro in GitHub.

Scenario con nome sicuro

Lo scenario seguente descrive il processo di firma di un assembly con un nome sicuro per farvi successivamente riferimento in base a tale nome.

  1. L'assembly A viene creato con un nome sicuro usando uno dei metodi seguenti:

    • Usando un ambiente di sviluppo che supporta la creazione di nomi sicuri, come Visual Studio.

    • Creando una coppia di chiavi crittografiche usando lo strumento Nome sicuro (Sn.exe) e assegnandola all'assembly mediante un compilatore della riga di comando o Assembly Linker (Al.exe). Windows SDK fornisce sia Sn.exe che Al.exe.

  2. L'ambiente di sviluppo o lo strumento firma l'hash del file contenente il manifesto dell'assembly con la chiave privata dello sviluppatore. La firma digitale viene archiviata nel file eseguibile portabile (PE) che contiene il manifesto dell'assembly A.

  3. L'assembly B è un consumer dell'assembly A. La sezione di riferimento del manifesto dell'assembly B include un token che rappresenta la chiave pubblica dell'assembly A. Un token è una parte della chiave pubblica completa e viene usato al posto della chiave stessa per risparmiare spazio.

  4. Common Language Runtime verifica la firma con nome sicuro quando l'assembly viene inserito nella Global Assembly Cache. Quando si esegue l'associazione in base al nome sicuro in fase di esecuzione, Common Language Runtime confronta la chiave archiviata nel manifesto dell'assembly B con la chiave usata per generare il nome sicuro per l'assembly A. Se i controlli di sicurezza di .NET vengono superati e l'associazione riesce, l'assembly B ha la garanzia che i bit dell'assembly A non siano stati manomessi e che questi bit provengono in effetti dagli sviluppatori dell'assembly A.

Nota

Questo scenario non permette di risolvere i problemi di attendibilità. Gli assembly possono contenere firme Microsoft Authenticode complete oltre a un nome sicuro. Le firme Authenticode includono un certificato che definisce l'attendibilità. È importante tenere presente che i nomi sicuri non richiedono che il codice sia firmato in questo modo. I nomi sicuri forniscono solo un'identità univoca.

Ignorare la verifica della firma degli assembly attendibili

A partire da .NET Framework 3.5 Service Pack 1, le firme con nome sicuro non vengono convalidate quando un assembly viene caricato in un dominio applicazione con attendibilità totale, ad esempio il dominio applicazione predefinito per la zona MyComputer. Questo comportamento è reso possibile dalla funzionalità che consente di ignorare la verifica del nome sicuro. In un ambiente con attendibilità totale le richieste di StrongNameIdentityPermission hanno sempre esito positivo per gli assembly con attendibilità totale firmati, indipendentemente dalla firma. La funzionalità che consente di ignorare la verifica del nome sicuro evita l'overhead superfluo della verifica delle firme con nome sicuro degli assembly con attendibilità totale in questa situazione, favorendo un caricamento più rapido degli assembly.

Questa funzionalità si applica a qualsiasi assembly firmato con un nome sicuro e che ha le caratteristiche seguenti:

  • È completamente attendibile senza prova StrongName (ad esempio, include la prova della zona MyComputer).

  • Viene caricato in un dominio AppDomain completamente attendibile.

  • Viene caricato da una località nell'ambito della proprietà ApplicationBase di AppDomain.

  • Non ha firma ritardata.

Questa funzionalità può essere disabilitata per singole applicazioni o per un computer. Vedere Procedura: Disabilitare la funzionalità che consente di ignorare il nome sicuro.

Posizione Descrizione
Procedura: Creare una coppia di chiavi pubblica/privata Descrive come creare una coppia di chiavi crittografiche per la firma di un assembly.
Procedura: Firmare un assembly con un nome sicuro Descrive come creare un assembly con nome sicuro.
Denominazione sicura avanzata Descrive i miglioramenti apportati ai nomi sicuri in .NET Framework 4.5.
Procedura: Fare riferimento a un assembly con nome sicuro Descrive come fare riferimento a tipi o risorse in un assembly con nome sicuro in fase di compilazione o di esecuzione.
Procedura: Disabilitare la funzionalità che consente di ignorare il nome sicuro Descrive come disabilitare la funzionalità che consente di ignorare la convalida delle firme con nome sicuro. Questa funzionalità può essere disabilitata per tutte le applicazioni o per applicazioni specifiche.
Creare assembly Offre una panoramica degli assembly a file singolo e su più file.
Come ritardare la firma di un assembly in Visual Studio Descrive come firmare un assembly con un nome sicuro dopo la creazione dell'assembly.
Sn.exe (strumento Nome sicuro) Descrive lo strumento incluso in .NET Framework che permette di creare assembly con nomi sicuri. In questo strumento sono disponibili opzioni per la gestione delle chiavi nonché per la generazione e la verifica delle firme.
Al.exe (Assembly Linker) Descrive lo strumento incluso in .NET Framework che genera un file contenente un manifesto dell'assembly da moduli o file di risorse.