Creare e usare gli assembly con nome sicuroCreate and use strong-named assemblies

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.A strong name consists of the assembly's identity—its simple text name, version number, and culture information (if provided)—plus a public key and a digital signature. Questo nome viene generato da un file di assembly usando la chiave privata corrispondente.It is generated from an assembly file using the corresponding private key. Il file di assembly contiene il manifesto dell'assembly, che include i nomi e gli hash di tutti i file che costituiscono l'assembly.(The assembly file contains the assembly manifest, which contains the names and hashes of all the files that make up the assembly.)

Avviso

Non usare i nomi sicuri per la sicurezza,Do not rely on strong names for security. poiché forniscono solo un'identità univoca.They provide a unique identity only.

Gli assembly con nome sicuro possono usare solo tipi da altri assembly con nome sicuro.A strong-named assembly can only use types from other strong-named assemblies. In caso contrario, l'integrità dell'assembly con nome sicuro risulterebbe compromessa.Otherwise, the integrity of the strong-named assembly would be compromised.

Nota

Sebbene .NET Core supporti assembly con nome sicuro e tutti gli assembly nella libreria .NET Core siano firmati, la maggior parte degli assembly di terze parti non necessita di nomi sicuri.Although .NET Core supports strong-named assemblies, and all assemblies in the .NET Core library are signed, the majority of third-party assemblies do not need strong names. Per altre informazioni, vedere firma con nome sicuro su GitHub.For more information, see Strong Name Signing on GitHub.

Scenario con nome sicuroStrong name scenario

Lo scenario seguente descrive il processo di firma di un assembly con un nome sicuro per farvi successivamente riferimento in base a tale nome.The following scenario outlines the process of signing an assembly with a strong name and later referencing it by that name.

  1. L'assembly A viene creato con un nome sicuro usando uno dei metodi seguenti:Assembly A is created with a strong name using one of the following methods:

    • Usando un ambiente di sviluppo che supporta la creazione di nomi sicuri, come Visual Studio.Using a development environment that supports creating strong names, such as 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).Creating a cryptographic key pair using the Strong Name tool (Sn.exe) and assigning that key pair to the assembly using either a command-line compiler or the Assembly Linker (Al.exe). Windows SDK fornisce sia Sn.exe che Al.exe.The Windows SDK provides both Sn.exe and 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.The development environment or tool signs the hash of the file containing the assembly's manifest with the developer's private key. La firma digitale viene archiviata nel file eseguibile portabile (PE) che contiene il manifesto dell'assembly A.This digital signature is stored in the portable executable (PE) file that contains Assembly A's manifest.

  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.Assembly B is a consumer of Assembly A. The reference section of Assembly B's manifest includes a token that represents Assembly A's public key. Un token è una parte della chiave pubblica completa e viene usato al posto della chiave stessa per risparmiare spazio.A token is a portion of the full public key and is used rather than the key itself to save space.

  4. Common Language Runtime verifica la firma con nome sicuro quando l'assembly viene inserito nella Global Assembly Cache.The common language runtime verifies the strong name signature when the assembly is placed in the global assembly cache. Quando si esegue l'associazione in base al nome sicuro in runtime, 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 Framework 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.When binding by strong name at run time, the common language runtime compares the key stored in Assembly B's manifest with the key used to generate the strong name for Assembly A. If the .NET Framework security checks pass and the bind succeeds, Assembly B has a guarantee that Assembly A's bits have not been tampered with and that these bits actually come from the developers of Assembly A.

Nota

Questo scenario non permette di risolvere i problemi di attendibilità.This scenario doesn't address trust issues. Gli assembly possono contenere firme Microsoft Authenticode complete oltre a un nome sicuro.Assemblies can carry full Microsoft Authenticode signatures in addition to a strong name. Le firme Authenticode includono un certificato che definisce l'attendibilità.Authenticode signatures include a certificate that establishes trust. È importante tenere presente che i nomi sicuri non richiedono che il codice sia firmato in questo modo.It's important to note that strong names don't require code to be signed in this way. I nomi sicuri forniscono solo un'identità univoca.Strong names only provide a unique identity.

Ignorare la verifica della firma degli assembly attendibiliBypass signature verification of trusted assemblies

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.Starting with the .NET Framework 3.5 Service Pack 1, strong-name signatures are not validated when an assembly is loaded into a full-trust application domain, such as the default application domain for the MyComputer zone. Questo comportamento è reso possibile dalla funzionalità che consente di ignorare la verifica del nome sicuro.This is referred to as the strong-name bypass feature. In un ambiente con attendibilità totale le richieste di StrongNameIdentityPermission hanno sempre esito positivo per gli assembly con attendibilità totale firmati, indipendentemente dalla firma.In a full-trust environment, demands for StrongNameIdentityPermission always succeed for signed, full-trust assemblies, regardless of their signature. 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.The strong-name bypass feature avoids the unnecessary overhead of strong-name signature verification of full-trust assemblies in this situation, allowing the assemblies to load faster.

Questa funzionalità si applica a qualsiasi assembly firmato con un nome sicuro e che ha le caratteristiche seguenti:The bypass feature applies to any assembly that is signed with a strong name and that has the following characteristics:

  • È completamente attendibile senza prova StrongName (ad esempio, include la prova della zona MyComputer).Fully trusted without StrongName evidence (for example, has MyComputer zone evidence).

  • Viene caricato in un dominio AppDomain completamente attendibile.Loaded into a fully trusted AppDomain.

  • Viene caricato da una località nell'ambito della proprietà ApplicationBase di AppDomain.Loaded from a location under the ApplicationBase property of that AppDomain.

  • Non ha firma ritardata.Not delay-signed.

Questa funzionalità può essere disabilitata per singole applicazioni o per un computer.This feature can be disabled for individual applications or for a computer. Vedere procedura: disabilitare la funzionalità di bypass con nome sicuro.See How to: Disable the strong-name bypass feature.

TitoloTitle DescrizioneDescription
Procedura: Creare una coppia di chiavi pubblica/privataHow to: Create a public-private key pair Descrive come creare una coppia di chiavi crittografiche per la firma di un assembly.Describes how to create a cryptographic key pair for signing an assembly.
Procedura: firmare un assembly con un nome sicuroHow to: Sign an assembly with a strong name Descrive come creare un assembly con nome sicuro.Describes how to create a strong-named assembly.
Denominazione sicura avanzataEnhanced strong naming Descrive i miglioramenti apportati ai nomi sicuri in .NET Framework 4.5.Describes enhancements to strong-names in the .NET Framework 4.5.
Procedura: fare riferimento a un assembly con nome sicuroHow to: Reference a strong-named assembly Descrive come fare riferimento a tipi o risorse in un assembly con nome sicuro in fase di compilazione o di esecuzione.Describes how to reference types or resources in a strong-named assembly at compile time or run time.
Procedura: disabilitare la funzionalità di bypass con nome sicuroHow to: Disable the strong-name bypass feature Descrive come disabilitare la funzionalità che consente di ignorare la convalida delle firme con nome sicuro.Describes how to disable the feature that bypasses the validation of strong-name signatures. Questa funzionalità può essere disabilitata per tutte le applicazioni o per applicazioni specifiche.This feature can be disabled for all or for specific applications.
Creazione di assemblyCreate assemblies Offre una panoramica degli assembly a file singolo e su più file.Provides an overview of single-file and multifile assemblies.
Come ritardare la firma di un assembly in Visual StudioHow to delay sign an assembly in Visual Studio Descrive come firmare un assembly con un nome sicuro dopo la creazione dell'assembly.Explains how to sign an assembly with a strong name after the assembly has been created.
Sn. exe (strumento nome sicuro)Sn.exe (Strong Name tool) Descrive lo strumento incluso in .NET Framework che permette di creare assembly con nomi sicuri.Describes the tool included in the .NET Framework that helps create assemblies with strong names. In questo strumento sono disponibili opzioni per la gestione delle chiavi nonché per la generazione e la verifica delle firme.This tool provides options for key management, signature generation, and signature verification.
Al. exe (assembly linker)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.Describes the tool included in the .NET Framework that generates a file that has an assembly manifest from modules or resource files.