Starke Namen dank Signierung unter .NET Strong Assemblies generieren

Autor / Redakteur: Dipl.-Ing. Andreas Maslo / Stephan Augsten

Signierte Assemblies sind .NET-Komponenten und -Anwendungen mit Echtheitsausweis, die programmübergreifend über den globalen Assembly-Speicher veröffentlicht werden. Jedes dieser Code-Segmente muss selbst einen starken Namen besitzen, der sich aus einem öffentlichen Schlüssel, einer Signatur und einer Assembly-Bezeichnung zusammensetzt. Mithilfe der zuvor genannten Informationen ist auch das Fundament für den .NET-Versionsmechanismus gelegt.

Anbieter zum Thema

Bevor Sie ein Assembly für die gemeinsame Nutzung über den Global Assembly Cache (GAC) freigeben können, müssen Sie das Assembly selbst mit einem starken Namen (Strong Name) ausstatten. Der Strong Name ist eine einfache Zeichenkette (String), die sich aus der Bezeichnung, dem zugeordneten öffentlichen Schlüssel sowie einer digitalen Signatur zusammensetzt. Der Strong Name unterbindet es, dass für ein Assembly der darüber implementierte Namespace erweitert oder übernommen werden kann.

Änderungen an besagtem Assembly sind in jedem Fall dem Herausgeber vorbehalten, der neben dem öffentlichen Schlüssel (Public Key) auch über den passenden privaten Schlüssel (Private Key) verfügt. Entsprechend kann damit auch die fortlaufende Version eines Assemblies bei entsprechender Weiterentwicklung sichergestellt werden.

Wird ein Assembly mit unterschiedlichen Schlüsseln neu übersetzt, so erhält es damit automatisch auch einen neuen starken Namen. Unterschiedliche Strong Names für Assemblies mit gleicher Funktionalität sorgen dafür, dass auch die Common Language Runtime (CLR) diese als unterschiedlich betrachtet und dementsprechend behandelt. Entsprechend werden zwei gleichnamige Assemblies als identisch behandelt, auch wenn deren Funktionalität sich unterscheidet. Durch interne Mechanismen für die Anlage der Strong Names ist es allerdings auszuschließen, das identische starke Namen für unterschiedliche Assemblies generiert werden.

Schlüssel generieren

Bevor ein Assembly mit einem Schlüssel versehen werden kann, müssen Sie zunächst den einzubindenden Schlüssel selbst generieren. Dazu nutzen Sie das Hilfsprogramm sn.exe für die SDK-Eingabeaufforderung, das neben der Schlüsselanlage auch erweiterte Funktionen zur Schlüsselverwaltung anbietet.

Um einen Herstellerspezifischen Schlüssel unter dem Namen IngES im Wurzelverzeichnis des Laufwerks C:\ anzulegen, reicht beispielsweise der nachfolgende Befehl an der SDK-Eingabeaufforderung aus:

Prompt>sn –k c:\inges.snk [Enter]

Achten Sie darauf, dass der Kommandozeilenschalter –k für die eigentliche Generierung des Schlüsselpaares, das sich selbst aus dem privaten und öffentlichen Schlüssel zusammensetzt, verantwortlich ist. Entsprechend können Sie mit dem Schalter –e für die Extrahierung des öffentlichen Schlüssels aus einer vorhandenen Schlüsseldatei (z.B. c:\inges.snk) in eine namentlich anzugebende Datei sorgen. Die generierte Schlüsseldatei können Sie für mehrere Assemblies nutzen und damit die herstellerspezifische Signierung sicherstellen.

Schlüssel auf Quelltextebene zuordnen

Der Strong Name wird für ein Assembly über die Entwicklungsumgebung beim Übersetzen generiert, nachdem Sie die Schlüsseldatei per Assembly-Attribut dem entsprechenden Assembly zuweisen. Jedem Projekt wird unter Visual Basic.NET zur Verwaltung der Assembly-Attribute die Quelltextdatei „.AssemblyInfo.vb“ zugeordnet.

Unter C# trägt die entsprechende Quelltextdatei den Namen AssemblyInfo.cs. In dieser Datei werden neben den Versionsinformationen auch Herstellerinformationen abgelegt (z.B. Produktbeschreibung, Urheber, Handelsmarke). Die Schlüsseldatei wird über den nachfolgenden Befehl eingefügt, wobei wir uns auf das vorangeganene Beispiel beziehen.

Unter C# hat das Assembly-Attribut die nachfolgende Syntax:

[assembly: AssemblyKeyFile(„c:\inges.snk“)]

Alternativ kann die Schlüsselzuweisung auch über den Assembly-Linker al.exe sowie den darüber bereitgestellten gesonderten Kommandozeilenschalter /keyf:Schlüsseldatei.snk erfolgen. Der öffentliche Schlüssel wird im Manifest des Assemblies abgelegt und genutzt, um bei der Referenzierung eines Assemblies ein Token zu generieren. Dabei handelt es sich um einen Hash-Wert zu diesem Schlüssel, der ebenfalls ins Manifest eingetragen wird.

Die Common Language Runtime nutzt kryptografische Verfahren, um das Laden des korrekten Assemblies sicherzustellen. Um Verweise auf Assemblies mit Strong Name aufzulösen, wird das Token im Manifest eines Assemblies mit dem Hash-Wert verglichen, das über den öffentlichen Schlüssel nachgebildet werden kann. Nur bei Übereinstimmung kann die Vertrauenswürdigkeit sichergestellt werden. Damit wird auch das Einschleusen von unsicherem Code unterbunden.

Artikelfiles und Artikellinks

(ID:2004874)