C#-Compileroptionen für Sicherheit

Mit den folgenden Optionen werden Compilersicherheitsoptionen gesteuert. Die neue MSBuild-Syntax wird fett formatiert dargestellt. Die ältere csc.exe-Syntax wird in code style dargestellt.

  • PublicSign / -publicsign: Signiert die Assembly öffentlich.
  • DelaySign / -delaysign: Assembly nur mit dem öffentlichen Teil des Schlüssels für einen starken Namen verzögert signieren.
  • KeyFile / -keyfile: Gibt eine Schlüsseldatei mit einem starken Namen an.
  • KeyContainer / -keycontainer: Gibt einen Schlüsselcontainer mit einem starken Namen an.
  • HighEntropyVA / -highentropyva: Aktiviert ASLR (Address Space Layout Randomization) mit hoher Entropie.

Hinweis

Weitere Informationen zum Konfigurieren dieser Optionen für Ihr Projekt finden Sie unter Compileroptionen.

PublicSign

Diese Option bewirkt, dass der Compiler einen öffentlichen Schlüssel anwendet, die Assembly aber nicht tatsächlich signiert. Mit der Option PublicSign wird zudem ein Bit in der Assembly festgelegt, das die Runtime informiert, dass die Datei signiert ist.

<PublicSign>true</PublicSign>

Für die Option PublicSign müssen die Optionen KeyFile oder KeyContainer verwendet werden. Die Optionen Keyfile und KeyContainer geben den öffentlichen Schlüssel an. Die Optionen Delaysign und Publicsign schließen sich gegenseitig aus. Bei der öffentlichen Signierung, die manchmal auch als „Fake-Signierung“ oder „OSS-Signierung“ bezeichnet wird, wird der öffentliche Schlüssel in eine Ausgabeassembly eingefügt und das Flag „signed“ (signiert) festgelegt. Bei öffentlicher Signierung wird die Assembly jedoch nicht wirklich mit einem privaten Schlüssel signiert. Entwickler verwenden eine öffentliche Signatur für Open-Source-Projekte. Entwickler erstellen Assemblys, die mit veröffentlichten „vollständig signierten“ Assemblys kompatibel sind, wenn sie keinen Zugriff auf den privaten Schlüssel haben, der zum Signieren der Assemblys verwendet wird. Da nur wenige Benutzer tatsächlich überprüfen müssen, ob die Assembly vollständig signiert ist, sind diese öffentlich erstellten Assemblys in fast jedem Szenario verwendbar, in dem eine vollständig signierte Assembly verwendet werden würde.

DelaySign

Durch diese Option reserviert der Compiler Speicherplatz in der Ausgabedatei, damit digitale Signaturen später hinzugefügt werden können.

<DelaySign>true</DelaySign>

Verwenden Sie DelaySign- , wenn die Assembly vollständig signiert werden soll. Verwenden Sie DelaySign, wenn Sie nur den öffentlichen Schlüssel in der Assembly platzieren möchten. Die Option DelaySign hat keine Auswirkung, wenn Sie nicht mit KeyFile oder KeyContainer verwendet wird. Die Optionen KeyContainer und PublicSign schließen sich gegenseitig aus. Wenn Sie eine vollständig signierte Assembly anfordern, wird vom Compiler der Hash der Datei mit dem Manifest (Assemblymetadaten) erstellt und mit dem privaten Schlüssel signiert. Dadurch wird eine digitale Signatur erstellt, die in der Datei gespeichert wird, die das Manifest enthält. Wenn eine Assembly mit Verzögerung signiert wird, wird die Signatur vom Compiler nicht berechnet und gespeichert, sondern lediglich ein Bereich in der Datei reserviert, damit die Signatur zu einem späteren Zeitpunkt hinzugefügt werden kann. Der Compiler reserviert lediglich einen Bereich in der Datei, damit die Signatur zu einem späteren Zeitpunkt hinzugefügt werden kann.

Mit DelaySign können Tester die Assembly im globalen Cache ablegen. Nach dem Testen können Sie die Assembly vollständig signieren, indem Sie den privaten Schlüssel der Assembly mithilfe des Hilfsprogramms Assembly Linker platzieren. Weitere Informationen finden Sie unter Erstellen und Verwenden von Assemblys mit starkem Namen und Verzögertes Signieren einer Assembly.

KeyFile

Gibt den Dateinamen mit dem kryptografischen Schlüssel an.

<KeyFile>filename</KeyFile>

file ist der Name der Datei mit dem Schlüssel mit starkem Namen. Wenn diese Option verwendet wird, fügt der Compiler den öffentlichen Schlüssel von der angegebenen Datei in das Assemblymanifest ein und signiert anschließend die endgültige Assembly mit dem privaten Schlüssel. Geben Sie sn -k file in die Befehlszeile ein, um eine Schlüsseldatei zu generieren. Wenn Sie mit -target:module kompilieren, wird der Name der Schlüsseldatei im Modul gespeichert und in die Assembly integriert, die erstellt wird, wenn Sie eine Assembly mit AddModules kompilieren. Außerdem können Sie Ihre Verschlüsselungsinformationen mit KeyContainer an den Compiler übergeben. Verwenden Sie DelaySign, wenn die Assembly teilweise signiert werden soll. Wenn sowohl KeyFile als auch KeyContainer in der gleichen Kompilierung angegeben werden, versucht es der Compiler zuerst mit dem Schlüsselcontainer. Wenn dies erfolgreich ist, wird die Assembly mit den Informationen im Schlüsselcontainer signiert. Wenn den Compiler den Schlüsselcontainer nicht findet, wird versucht, die mit KeyFile angegebene Datei zu verwenden. Wenn dies erfolgreich ist, wird die Assembly mit den Informationen in der Schlüsseldatei signiert, und die Schlüsselinformationen werden im Schlüsselcontainer installiert. Bei der nächsten Kompilierung ist der Schlüsselcontainer gültig. Eine Schlüsseldatei enthält möglicherweise nur den öffentlichen Schlüssel. Weitere Informationen finden Sie unter Erstellen und Verwenden von Assemblys mit starkem Namen und Verzögertes Signieren einer Assembly.

KeyContainer

Gibt den Namen des kryptografischen Schlüsselcontainers an.

<KeyContainer>container</KeyContainer>

container ist der Name des Schlüsselcontainers mit dem starken Namen. Wenn die Option KeyContainer verwendet wird, erstellt der Compiler eine Komponente, die freigegeben werden kann. Der Compiler fügt einen öffentlichen Schlüssel vom angegebenen Container in das Assemblymanifest ein und signiert die endgültige Assembly mit dem privaten Schlüssel. Geben Sie sn -k file in die Befehlszeile ein, um eine Schlüsseldatei zu generieren. sn -i installiert das Schlüsselpaar im Container. Diese Option wird nicht unterstützt, wenn der Compiler unter CoreCLR ausgeführt wird. Verwenden Sie zum Signieren einer Assembly beim Erstellen unter CoreCLR die Option KeyFile. Wenn Sie mit TargetType kompilieren, wird der Name der Schlüsseldatei im Modul gespeichert und in die Assembly integriert, wenn Sie dieses Modul mit AddModules in eine Assembly kompilieren. Sie können diese Option auch als benutzerdefiniertes Attribut (System.Reflection.AssemblyKeyNameAttribute) im Quellcode für ein beliebiges CIL-Modul (Common Intermediate Language) angeben. Außerdem können Sie Ihre Verschlüsselungsinformationen mit KeyFile an den Compiler übergeben. Verwenden Sie DelaySign, um den öffentlichen Schlüssel zum Assemblymanifest hinzuzufügen, die Assembly aber erst zu signieren, nachdem sie getestet wurde. Weitere Informationen finden Sie unter Erstellen und Verwenden von Assemblys mit starkem Namen und Verzögertes Signieren einer Assembly.

HighEntropyVA

Die Compileroption HighEntropyVA informiert den Windows-Kernel, ob eine bestimmte ausführbare Datei ASLR (Address Space Layout Randomization) mit hoher Entropie unterstützt.

<HighEntropyVA>true</HighEntropyVA>

Diese Option gibt an, dass eine ausführbare 64-Bit-Datei oder eine Datei, die durch die Compileroption PlatformTarget gekennzeichnet ist, einen virtuellen Adressraum mit hoher Entropie unterstützt. Die Option ist standardmäßig für alle .NET Standard- und .NET Core-Versionen aktiviert, und .NET Framework Versionen ab .NET Framework 4.5.

Die Option HighEntropyVA ermöglicht den kompatiblen Versionen des Windows-Kernels, ein höheres Maß an Entropie zu verwenden, wenn das Adressbereichlayout eines Prozesses als Teil von ASLR zufällig festgelegt wird. Die Verwendung höherer Entropiegrade bedeutet, dass eine größere Anzahl von Adressen Speicherregionen wie Stacks und Heaps zugewiesen werden kann. Daher ist es schwieriger, den Ort eines bestimmten Speicherbereichs zu schätzen. Die Compileroption HighEntropyVA setzt voraus, dass die ausführbare Zieldatei und alle von ihr abhängigen Module Zeigerwerte mit einer Größe von mehr als 4 GB verarbeiten können, wenn sie als 64-Bit-Prozess ausgeführt werden.