Opzioni del compilatore C# per la sicurezza

Le opzioni seguenti controllano le opzioni di sicurezza del compilatore. La nuova sintassi di MSBuild viene visualizzata in grassetto. La sintassi di csc.exe precedente è illustrata in code style.

  • PublicSign / -publicsign: firmare pubblicamente l'assembly.
  • DelaySign / -delaysign: ritardare la firma dell'assembly utilizzando solo la parte pubblica della chiave con nome sicuro.
  • KeyFile / -keyfile: specificare un file di chiave con nome sicuro.
  • KeyContainer / -keycontainer: specificare un contenitore di chiavi con nome sicuro.
  • HighEntropyVA / -highentropyva: abilitare la randomizzazione ASLR (High-Entropy Address Space Layout Randomization)

PublicSign

Questa opzione indica al compilatore di applicare una chiave pubblica ma non firma effettivamente l'assembly. L'opzionePublicSign imposta anche un bit nell'assembly che indica al runtime che il file è firmato.

<PublicSign>true</PublicSign>

L'opzione PublicSign richiede l'uso dell’opzione KeyFile o KeyContainer. Le opzioni KeyFile o KeyContainer specificano la chiave pubblica. Le opzioni PublicSign e DelaySign si escludono a vicenda. Talvolta denominata "firma falsa" o "firma OSS", la firma pubblica include la chiave pubblica in un assembly di output e imposta il flag "firmato". La firma pubblica non firma effettivamente l'assembly con una chiave privata. Gli sviluppatori usano il segno pubblico per i progetti open source. Compilano gli assembly che non sono compatibili con gli assembly "completamente firmati" rilasciati quando non hanno accesso alla chiave privata usata per firmare gli assembly. Dato che soli pochi consumer hanno effettivamente la necessità di verificare se l'assembly è dotato di una firma completa, questi assembly compilati pubblicamente sono utilizzabili in quasi tutti gli scenari in cui verrebbe usato un assembly con firma completa.

DelaySign

Questa opzione indica al compilatore di riservare spazio nel file di output in modo che si possa aggiungere una firma digitale in un secondo tempo.

<DelaySign>true</DelaySign>

Usare DelaySign- se si vuole un assembly con firma completa. Usare DelaySign se si vuole solo inserire la chiave pubblica nell'assembly. L'opzione DelaySign ha effetto solo se abbinata all'opzione KeyFile o KeyContainer. Le opzioni KeyContainer e PublicSign si escludono a vicenda. Quando si richiede un assembly con firma completa, il compilatore genera un hash per il file contenente il manifesto (i metadati dell'assembly) e firma tale hash con la chiave privata. Tale operazione crea una firma digitale che viene archiviata nel file contenente il manifesto. Quando un assembly viene firmato in ritardo, il compilatore non calcola e archivia la firma. Al contrario, il compilatore riserva spazio nel file in modo che la firma possa essere aggiunta in un secondo momento.

L'uso di DelaySign consente a un tester di inserire l'assembly nella Global Assembly Cache. Al termine del test, è possibile firmare completamente l'assembly inserendo la chiave privata nell'assembly con l'utilità Assembly Linker. Per altre informazioni, vedere Creazione e uso degli assembly con nome sicuro e Ritardo della firma di un assembly.

KeyFile

Specifica il nome file contenente la chiave crittografica.

<KeyFile>filename</KeyFile>

file è il nome del file che contiene la chiave con nome sicuro. Se si usa questa opzione, il compilatore inserisce la chiave pubblica dal file specificato nel manifesto dell'assembly e quindi firma l'assembly finale con la chiave privata. Per generare un file di chiave, digitare sn -k file nella riga di comando. Se si esegue la compilazione con -target:module, il nome del file di chiave verrà mantenuto nel modulo e incorporato nell'assembly creato quando si compila un assembly con AddModules. È possibile passare al compilatore le informazioni di crittografia anche tramite KeyContainer. Usare DelaySign se si vuole un assembly con firma parziale. Nel caso in cui sia KeyFile che KeyContainer siano specificati nella stessa compilazione, il compilatore tenterà come prima cosa il contenitore di chiavi. Se l'operazione riesce, l'assembly viene firmato con le informazioni incluse nel contenitore di chiavi. Se invece il compilatore non trova il contenitore di chiavi, effettua un tentativo con il file specificato in KeyFile. In caso di esito positivo, l'assembly viene firmato con le informazioni contenute nel file di chiave e le informazioni sulla chiave saranno installate nel contenitore delle chiavi. Nella compilazione successiva il contenitore delle chiavi risulterà valido. Un file di chiave può contenere solo la chiave pubblica. Per altre informazioni, vedere Creazione e uso degli assembly con nome sicuro e Ritardo della firma di un assembly.

KeyContainer

Specifica il nome del contenitore di chiavi crittografiche.

<KeyContainer>container</KeyContainer>

container è il nome del contenitore di chiavi con nome sicuro. Quando si usa l'opzione KeyContainer, il compilatore crea un componente condivisibile. Il compilatore inserisce una chiave pubblica dal contenitore specificato nel manifesto dell'assembly e firma l'assembly finale con la chiave privata. Per generare un file di chiave, digitare sn -k file nella riga di comando. sn -i installa la coppia di chiavi in un contenitore. Questa opzione non è supportata quando il compilatore viene eseguito in CoreCLR. Per firmare un assembly quando si compila in CoreCLR, usare l'opzione KeyFile. Se si esegue la compilazione con TargetType, il nome del file di chiave verrà mantenuto nel modulo e incorporato nell'assembly quando il modulo verrà compilato in un assembly con AddModules. Questa opzione può essere specificata anche come attributo personalizzato System.Reflection.AssemblyKeyNameAttribute nel codice sorgente di qualsiasi modulo MSIL (Microsoft Intermediate Language). È possibile passare al compilatore le informazioni di crittografia anche tramite KeyFile. Usare DelaySign per aggiungere la chiave pubblica al manifesto dell'assembly, ma firmando l'assembly fino a quando non viene testato. Per altre informazioni, vedere Creazione e uso degli assembly con nome sicuro e Ritardo della firma di un assembly.

HighEntropyVA

L'opzione del compilatore HighEntropyVA indica al kernel di Windows se un particolare eseguibile supporta la funzionalità ASLR (Address Space Layout Randomization) a entropia elevata.

<HighEntropyVA>true</HighEntropyVA>

Questa opzione consente di specificare che un eseguibile a 64 bit o un eseguibile contrassegnato dall'opzione del compilatore PlatformTarget supporta uno spazio indirizzi virtuali a entropia elevata. L'opzione è abilitata per impostazione predefinita per tutte le versioni di .NET Standard e .NET Core e per le versioni .NET Framework a partire da .NET Framework 4.5.

Con l'opzione HighEntropyVA, nelle versioni compatibili del kernel di Windows è possibile usare livelli di entropia più elevati per la scelta casuale del layout dello spazio degli indirizzi di un processo in quanto parte di ASLR. L'utilizzo di livelli più elevati di entropia indica la possibilità di allocare un numero maggiore di indirizzi ad aree della memoria quali stack e heap. Di conseguenza, è più difficile indovinare la posizione di una determinata area di memoria. L'opzione del compilatore HighEntropyVA richiede l'eseguibile di destinazione e tutti i moduli da cui dipende possono gestire valori del puntatore superiori a 4 gigabyte (GB) quando vengono eseguiti come processo a 64 bit.