Verzögertes Signieren einer Assembly

Aktualisiert: November 2007

Ein Unternehmen kann über ein streng bewachtes Schlüsselpaar verfügen, auf das nicht einmal Entwickler täglich zugreifen können. Der öffentliche Schlüssel ist häufig frei zugänglich, der private Schlüssel hingegen ist nur einigen ausgewählten Personen bekannt. Bei der Entwicklung von Assemblys mit starkem Namen enthält jede Assembly, die auf die Zielassembly mit starkem Namen verweist, das Token des öffentlichen Schlüssels, mit dessen Hilfe der Zielassembly ein starker Name zugewiesen wurde. Aus diesem Grund ist es erforderlich, dass der öffentliche Schlüssel während des Entwicklungsprozesses allgemein zugänglich ist.

Sie können verzögertes oder teilweises Signieren während des Erstellens verwenden, um in der PE (Portable Executable)-Datei Platz für die starke Namenssignatur zu reservieren. Das tatsächliche Signieren können Sie auf einen späteren Zeitpunkt (normalerweise unmittelbar vor der Bereitstellung der Assembly) verschieben.

In den folgenden Schritten wird der prinzipielle Ablauf des verzögerten Signierens einer Assembly beschrieben:

  1. Besorgen Sie sich von der Organisation, die das eigentliche Signieren vornimmt, den öffentlichen Schlüssel des Schlüsselpaares. Im Normalfall liegt dieser Schlüssel als SNK-Datei vor, die mit dem Strong Name-Tool (Sn.exe) erstellt werden kann, das von Windows Software Development Kit (SDK) zur Verfügung gestellt wird.

  2. Fügen Sie dem Quellcode für die Assembly zwei benutzerdefinierte Attribute aus System.Reflection hinzu:

    • AssemblyKeyFileAttribute, das den Namen der Datei, die den öffentlichen Schlüssel enthält, als Parameter an seinen Konstruktor übergibt.

    • AssemblyDelaySignAttribute, das die Verwendung von verzögertem Signieren angibt, indem es true als Parameter an seinen Konstruktor übergibt. Beispiel:

          <Assembly:AssemblyKeyFileAttribute("myKey.snk")>
          <Assembly:AssemblyDelaySignAttribute(true)>
      
          [assembly:AssemblyKeyFileAttribute("myKey.snk")]
          [assembly:AssemblyDelaySignAttribute(true)]
      
  3. Der Compiler fügt den öffentlichen Schlüssel in das Assemblymanifest ein und reserviert in der PE-Datei Platz für die vollständige starke Namenssignatur. Der echte öffentliche Schlüssel muss während der Erstellung der Assembly gespeichert werden, damit andere Assemblys, die auf diese verweisen, auf den Schlüssel zugreifen und ihn in ihrem eigenen Assemblyverweis speichern können.

  4. Da die Assembly über keine gültige starke Namenssignatur verfügt, muss die Überprüfung dieser Signatur deaktiviert werden. Diese Deaktivierung können Sie vornehmen, indem Sie die Option –Vr zusammen mit dem Strong Name-Tool verwenden.

    Im folgenden Beispiel wird die Überprüfung für eine Assembly mit dem Namen myAssembly.dll deaktiviert.

    sn –Vr myAssembly.dll
    
    Vorsicht:

    Verwenden Sie die Option -Vr nur bei der Entwicklung. Das Überspringen der Überprüfung einer Assembly kann ein erhebliches Sicherheitsrisiko darstellen. Wenn die Überprüfung einer Assembly übersprungen wird, besteht die Gefahr, dass deren vollständig angegebener Assemblyname (Assemblyname, Version, Kultur und öffentliches Schlüsseltoken) als falsche Identität einer böswilligen Assembly verwendet wird. Dadurch würde auch die Überprüfung der böswilligen Assembly übersprungen.

  5. Zu einem späteren Zeitpunkt (üblicherweise unmittelbar vor der Veröffentlichung des Produkts) übergeben Sie unter Verwendung der Option –R zusammen mit dem Strong Name-Tool die Assembly der Signierungsstelle Ihrer Organisation, wo dann die eigentliche Signierung mit einem starken Namen erfolgt.

    Im folgenden Beispiel wird die Assembly myAssembly.dll unter Verwendung des Schlüsselpaares sgKey.snk mit einem starken Namen signiert.

    sn -R myAssembly.dll sgKey.snk
    

Siehe auch

Aufgaben

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

Konzepte

Erstellen von Assemblys

Referenz

Strong Name-Tool (Sn.exe)

Weitere Ressourcen

Programmieren mit Assemblys