Erstellen und Verwenden von Assemblys mit starkem Namen

Ein starker Name setzt sich aus der Identität der Assembly – dem einfachen Textnamen, der Versionsnummer und Kulturinformationen (falls vorhanden) – sowie einem öffentlichen Schlüssel und einer digitalen Signatur zusammen. Er wird mithilfe des entsprechenden privaten Schlüssels aus einer Assemblydatei generiert. (Die Assemblydatei enthält das Assemblymanifest, das seinerseits wiederum die Namen und Hashes aller Dateien enthält, aus denen die Assembly besteht.)

Eine Assembly mit starkem Namen kann nur Typen aus anderen Assemblys mit starkem Namen verwenden. Andernfalls ist die Sicherheit der Assembly mit starkem Namen beeinträchtigt.

Diese Übersicht enthält folgende Abschnitte:

  • Szenario für starken Namen

  • Umgehen der Signaturüberprüfung für vertrauenswürdige Assemblys

  • Verwandte Themen

Szenario für starken Namen

Im folgenden Szenario wird kurz umrissen, wie eine Assembly mit einem starken Namen signiert und wie später mit diesem Namen auf sie verwiesen wird.

  1. Assembly A wird auf eine der folgenden Weisen mit einem starken Namen erstellt:

    • Verwenden einer Entwicklungsumgebung, die das Erstellen starker Namen unterstützt, wie z. B. Visual Studio 2005.

    • Erstellen eines kryptografischen Schlüsselpaars mithilfe des Strong Name-Tools (Sn.exe) und Zuweisen dieses Schlüsselpaars zur Assembly unter Verwendung eines Befehlszeilencompilers oder mit dem Assemblylinker (Al.exe). Das Windows Software Development Kit (SDK) stellt sowohl Sn.exe als auch Al.exe zur Verfügung.

  2. Die Entwicklungsumgebung oder das Tool signiert den Hash der Datei, die das Assemblymanifest enthält, mit dem privaten Schlüssel des Entwicklers. Diese digitale Signatur wird in der PE (Portable Executable)-Datei gespeichert, die das Manifest von Assembly A enthält.

  3. Assembly B ist ein Consumer von Assembly A. Der Referenzabschnitt des Manifests von Assembly B enthält ein Token, das den öffentlichen Schlüssel von Assembly A darstellt. Ein Token ist ein Teilabschnitt des vollständigen öffentlichen Schlüssels und wird aus Platzgründen oft an Stelle des eigentlichen Schlüssels verwendet.

  4. Die Common Language Runtime überprüft die starke Namenssignatur, wenn die Assembly im globalen Assemblycache platziert wird. Wenn sie zur Laufzeit Bindungen durch einen starken Namen erstellen, vergleicht die Common Language Runtime den im Manifest von Assembly B gespeicherten Schlüssel mit dem Schlüssel, der für die Generierung des starken Namens für Assembly A verwendet wurde. Wenn die .NET Framework-Sicherheitsüberprüfungen erfolgreich verlaufen und die Bindung erfolgreich ist, hat Assembly B die Garantie, dass die Bits von Assembly A nicht manipuliert wurden, und dass diese Bits eigentlich von den Entwicklern der Assembly A stammen.

HinweisHinweis

Dieses Szenario deckt keine Fragen der Vertrauenswürdigkeit ab.Assemblys können neben starken Namen auch vollständige Microsoft Authenticode-Signaturen tragen.Authenticode-Signaturen enthalten ein Zertifikat, das Vertrauenswürdigkeit bescheinigt.Beachten Sie unbedingt, dass starke Namen es nicht erforderlich machen, Code auf diese Weise zu signieren.Die Schlüssel zum Generieren einer starken Namenssignatur müssen in der Tat nicht mit denen übereinstimmen, die zum Erstellen der Authenticode-Signatur verwendet werden.

Zurück nach oben

Umgehen der Signaturüberprüfung für vertrauenswürdige Assemblys

Ab .NET Framework, Version 3.5 Service Pack 1 werden Signaturen mit starkem Namen nicht überprüft, wenn ein Assembly in eine vollständig vertrauenswürdige Anwendungsdomäne geladen wird, wie etwa die Standardanwendungsdomäne für die Zone MyComputer. Dies wird als Strong-Name-Bypass-Feature bezeichnet. In einer vollständig vertrauenswürdigen Umgebung sind Forderungen nach StrongNameIdentityPermission für signierte, vollständig vertrauenswürdige Assemblys immer erfolgreich, unabhängig von deren Signatur. Das Strong-Name-Bypass-Feature vermeidet in dieser Situation den Aufwand der Überprüfung der Signatur mit starkem Namen für vollständig vertrauenswürdige Assemblys. Dies ermöglicht ein schnelleres Laden der Assemblys.

Das Bypass-Feature gilt für jede Assembly, die mit einem starken Namen signiert ist und die folgenden Eigenschaften aufweist:

  • Voll vertrauenswürdig ohne StrongName-Beweis (hat z. B. MyComputer-Zonenbeweis).

  • Geladen in eine voll vertrauenswürdige AppDomain.

  • Geladen von einem Speicherort unter der ApplicationBase-Eigenschaft von diesem AppDomain.

  • Nicht verzögert signiert.

Dieses Feature kann für einzelne Anwendungen oder einen Computer deaktiviert werden. Siehe Gewusst wie: Deaktivieren des Strong-Name-Bypass-Features.

Zurück nach oben

Verwandte Themen

Titel

Description

Gewusst wie: Erstellen eines öffentlichen/privaten Schlüsselpaars

Beschreibt das Erstellen eines kryptografischen Schlüsselpaars zum Signieren einer Assembly.

Gewusst wie: Signieren einer Assembly mit einem starken Namen

Beschreibt das Erstellen einer Assembly mit starkem Namen.

Gewusst wie: Verweisen auf eine Assembly mit starkem Namen

Beschreibt, wie auf Typen oder Ressourcen in einer Assembly mit starkem Namen zur Kompilier- oder Laufzeit verwiesen wird.

Gewusst wie: Deaktivieren des Strong-Name-Bypass-Features

Beschreibt, wie die Funktion, die die Validierung von Signaturen mit starkem Namen umgeht, deaktiviert wird. Diese Funktion kann für alle oder bestimmte Anwendungen deaktiviert werden.

Erstellen von Assemblys

Bietet eine Übersicht über Einfach- und Mehrfachdateiassemblys.

Gewusst wie: Verzögertes Signieren von Assemblys (Visual Studio)

Erläutert das Signieren einer Assembly mit einem starken Namen nach dem Erstellen der Assembly.

Sn.exe (Strong Name-Tool)

Beschreibt das Tool, das in .NET Framework enthalten ist, mit dem Assemblys mit starken Namen erstellt werden können. Dieses Tool stellt Optionen zum Verwalten von Schlüsseln, Erzeugen und Überprüfen von Signaturen bereit.

Al.exe (Assembly Linker-Tool)

Beschreibt das Tool, das in .NET Framework enthalten ist, mit dem eine Datei generiert wird, die ein Assemblymanifest von Modulen oder Ressourcendateien besitzt.

Zurück nach oben