Delayed Signing bezeichnet eine Technik, um Assemblies teilweise zu signieren, z.B. wenn sich diese noch in der Entwicklungsphase befinden,
Beim Signieren eines Assemblies wird mit Hilfe eines öffentlichen und eines privaten Schlüssels zum einen das so genannte Public Key Token in das Manifest eines Assemblies geschrieben und zum anderen wird eine mit Hilfe des privaten Schlüssels erstellte digitale Signatur in den PE-Header des Assemblies eingetragen, die über den öffentlichen Schlüssel des Assemblies validiert werden kann. Zum Erstellen dieser digitalen Signatur benötigt man demnach das öffentliche/private Schlüsselpaar während zur Validierung dieser Signatur der öffentliche Schlüssel ausreicht.
Signierte Assemblies können in den Global Assembly Cache (GAC) installiert werden und andere .NET-Applikationen können über den Strong Name zudem die exakte Version dieses Assemblies einbinden und referenzieren. (weitere Infos zum Signieren von Assemblies finden sich im Beitrag vom 28.08.2006) Einmal signierte Assemblies können nicht mehr geändert werden, da sich die digitale Signatur nach der Änderung mit dem öffentlichen Schlüssel nicht mehr auflösen lässt. Mit anderen Worten können einmal signierte Assemblies nicht mehr geändert werden, ohne dass die digitale Signatur ihre Gültigkeit verliert oder – im Kontext des Entwicklungsprozesses - nach jeder Assembly-Änderung muss diese erneut digital signiert werden.
Um die Funktionalitäten des öffentlichen Assemblies aber bereits während des Entwicklungsprozesses zu testen ohne dabei fortlaufend das Assembly dem teilweise aufwändigen Prozess der Signierung zu unterziehen und damit auf den mitunter streng geheimen privaten Schlüssel zugreifen zu müssen, kann das Public Key Token über den Prozess des Delayed Signing eingebunden und ein Platzhalter für die digitale Signatur in den PE-Header des Assemblies eingetragen werden. So können Assemblies zu Testzwecken auch ohne digitale Signatur installiert und von anderen .NET Applikationen referenziert werden.
Vor dem offiziellen Release des Assemblies wird der Platzhalter dann schließlich durch die echte digitale Signatur ersetzt.
Um ein Assembly so zu signieren, sind im Wesentlichen die folgenden Schritte notwendig:
1. Compiler-Anweisungen über Attribute im Quelltext definieren
using System.Reflection;
[assembly:AssemblyKeyFile("keys.snk")]
[assembly:AssemblyDelaySignAttribute(true)]
Das erste Attribut AssemblyKeyFile ist auch bei der „normalen“ Signierung von Assemblies notwendig. Das Public Key Token des öffentlichen Schlüssels wird in das Manifest des Assemblies eingetragen.
Das zweite Attribut AssemblyDelaySignAttribute sorgt nun dafür, dass der Compiler Platz für die spätere digitale Signatur im PE-Header reserviert.
2. Das Assembly zur Skip Verification List hinzufügen, um die Verifizierung dieses Assemblies anhand der digitalen Signatur zu unterdrücken (z.B. mit dem Kommandozeilen-Werkzeug Strong Name Utility)
sn –Vr assemblyname.dll
In diesem Beispiel sorgt die Option –Vr dafür, dass das Assembly assemblyname.dll der Skip Verification List hinzugefügt wird.
Allerdings sollte man nicht allzu sorglos Assemblies dieser Liste hinzufügen. Ein schädliches Assembly könnte die Identität eines Assemblies aus dieser Liste vortäuschen und so ungewollt die Verifizierung umgehen.
Mit der Option -Vu können Assemblies wieder aus der Skip Verification List gelöscht werden:
sn –Vu assemblyname.dll
Hinweis: Eine Übersicht aller Optionen des Strong Name Tools erhalten Sie auf den MSDN-Seiten.
3. Nach Finalisierung des Assemblies die echte digitale Signatur einfügen.
sn –R assemblyname.dll keypair.snk
Schließlich erhält das Assembly vor der Auslieferung noch die echte digitale Signatur, die den Platzhalter ersetzt.