Was ist ein ?Strong Name??
Ein Assembly, das mit dem Anwendungsverzeichnis ausgeliefert wird, benötigt in der Regel keinen besonderen Namen. Ein Assembly aber, das von mehreren Anwendungen gleichzeitig benutzt werden soll, braucht einen absolut eindeutigen Namen ? den sogenannten ?strong name? (starken Namen).
Dieser strong name ist ein einfacher Textstring, der sich aus dem Namen der Assembly, einem öffentlichen Schlüssel und einer digitalen Signatur zusammensetzt.
Ein strong name erfüllt folgende Anforderungen:
? Namenseindeutigkeit durch die Verwendung eindeutiger Schlüsselpaare
? Schutz der Versionsherkunft ? nur der Entwickler des Codes kann eine Folge-Version des Assemblies erstellen
? garantiert Integrität der Assembly
? Installation im Global Assembly Cache (GAC) möglich
Um die Vorteile eines Assemblies mit starkem Namen zu behalten und Dll-Konflikte zu vermeiden, können Assemblies mit strong name nur auf Assemblies mit strong name verweisen.
Wie erstelle ich eine Assembly mit einem starken Namen?
Um ein Assembly mit einem starken Namen zu erstellen, muß man zuerst ein Schlüsselpaar aus einem öffentlichen und einem privaten Schlüssel generieren.
Dafür gibt es das Kommandozeilen-Tool sn.exe im Verzeichnis %FrameworkSDK%\bin.
In der Eingabe aufforderung geben Sie folgenden Befehl ein:
Es wird dabei ein Schlüsselpaar in der Datei meinKey.snk angelegt.
Dieses Schlüsselpaar muß dann der Assembly zugewiesen, d.h. signiert werden. Dafür haben Sie zwei verschiedene Möglichkeiten.
1. Signieren über Attribute unter Verwendung der Datei AssemblyInfo.vb bzw .cs:
[Visual Basic] <Assembly: AssemblyKeyFileAttribute("meinKey.snk")> [C#] [assembly: AssemblyKeyFileAttribute(@"..\..\meinKey.snk")] |
Falls Sie eine IDE, z. B. Visual Studio .NET, verwenden, müssen Sie wissen, wo diese nach der Schlüsseldatei sucht. Visual Basic .NET sucht die Schlüsseldatei beispielsweise in dem Verzeichnis, in dem die Visual Studio-Projektmappe enthalten ist, wohingegen der C#-Compiler die Schlüsseldatei in dem Verzeichnis sucht, in dem die Binärdatei enthalten ist.
2. Signieren über die Nutzung des Kommandozeilen-Tools Assembly-Linker al.exe:
al /out:meinAssembly.dll meinModul.netmodule /keyfile:meinKey.snk |
Bei beiden Möglichkeiten wird der öffentliche Schlüssel als sogenannter Token im Manifest der Assembly abgelegt. Ein Token ist ein Teilabschnitt des vollständigen öffentlichen Schlüssels und wird aus Platzgründen oft an Stelle des eigentlichen Schlüssels verwendet. Zusätzlich wird die Assembly mit dem privaten Schlüssel signiert. Diese Signatur ist wiederum Teil des Manifests.
Durch die Umkehrung der Signatur mit Hilfe des öffentlichen Schlüssels kann man nun sicher feststellen, ob eine Assembly auf dem Weg vom Autor zum Empfänger verändert wurde.
Somit kann kein Unbefugter den Code ändern, wenn er nicht im Besitz des vollständigen Schlüsselpaares ist.
Es ist zu empfehlen, ein Schlüsselpaar nur einmal für eine Firma bzw. für ein Projekt zu generieren und diese Datei, vor allem den privaten Schlüssel, gut unter Verschluß zu halten.
Da Sie eine Assembly nach dem Erstellen nicht mehr mit einem strong name signieren können, stellt sich die Frage, was ich als Entwickler tun kann, wenn ich gerade nur über den öffentlichen, nicht aber den privaten Schlüssel verfüge. Darauf gibt es eine einfache Antwort: das verzögerte Signieren.
Wie funktioniert das verzögerte Signieren?
Beim verzögerten Signieren (delayed signing) wird die Assembly vorerst nur teilweise signiert. Dabei wird nur der öffentliche Schlüssel verwendet. Für den privaten Schlüssel und die vollständige Signierung wir Platz reserviert.
Zuerst müssen Sie über den öffentlichen Schlüssel verfügen.
Sollten Sie über das vollständige Schlüsselpaar verfügen und das verzögerte Signieren aus einem anderen Grund anwenden wollen, können Sie den öffentlichen Schlüssel so aus der Schlüssel-Datei herausfiltern:
Sn -p meinKey.snk meinPublicKey.snk |
meinPublicKey.snk enthält nun nur den öffentlichen Schlüssel der Datei meinKey.snk.
Nun fügen Sie der AssemblyInfo-Datei zwei benutzerdefinierte Attribute aus dem System.Reflection Namespace hinzu:
[Visual Basic] <Assembly:AssemblyKeyFileAttribute("meinPublicKey.snk")> <Assembly:AssemblyDelaySignAttribute(true)> [C#] [assembly:AssemblyKeyFileAttribute("meinPublicKey.snk")] [assembly:AssemblyDelaySignAttribute(true)] |
Dabei wird der Name der Datei mit dem öffentlichen Schlüssel angegeben und das verzögerte Signieren durch den Wert ?true? aktiviert.
Wird das Assembly dann kompiliert, ist es zwar nur teilweise signiert, besitzt aber einen starken Namen und kann im GAC installiert und dort verwendet werden.
Zuvor muß allerdings noch die Überprüfung der Signatur deaktiviert werden, da die Assembly ja über keine gültige starke Namenssignatur verfügt. Diese Deaktivierung können Sie wieder mit dem Strong Name-Tool vornehmen:
Zu einem späteren Zeitpunkt, üblicherweise unmittelbar vor der Weitergabe, signieren Sie dann die Assembly mit dem kompletten Schlüsselpaar:
Danach schalten Sie die Verifizierung für die Assembly wieder ein:
Hinweis: Bei allen Optionen für Sn.exe wird die Groß- und Kleinschreibung beachtet. Eine vollständige Liste aller Optionen finden Sie in der .NET Framework SDK-Dokumentation unter dem Stichwort 'sn.exe'.