Signtool.exe mit CACert

cacert4 Wer eigenen Komponenten für die Integration Services entwickelt, wird in den meisten Fällen auch einen Installer für die jeweilige Komponente erstellen. Wie man eigene erstellt, habe ich im Blog Eintrag “Windows Installer für eigene Erweiterungen” beschrieben. Da die Installer standardmäßig nicht signiert sind, weißt die UAC während der Installation darauf mit einem kleinen Warnhinweis hin.

UnknownPublisher

Um Installer zu signieren wird ein offizielles Zertifikat benötigt, im Normalfall sind dies Zertifikate von VeriSign, Thawte oder TC Trust Center. Microsoft liefert zur Signierung von MSI Files (und anderen Dateien) das Signaturtool (SignTool.exe) zusammen mit dem .NET Framework aus. Leider kosten die Zertifikate bei z. B. Verisign ca. 900 $. Gerade im Open Source Bereich setzen sich deswegen vermehrt Zertifikate der nicht kommerziellen Zertifizierungsstelle CACert (Wikipedia: CACert) durch. Der große Nachteil von CAcert ist, dass das entsprechende Stammzertifikat noch nicht in der Zertifikatsdatenbank der Standard Browsern und Email-Clients als vertrauenswürdige Zertifizierungsstelle eingetragen ist. Somit ist eine Signierung, zumindest im kommerziellen Bereich, nicht sinnvoll.

Für den privaten Bereich, eventuell im Open Source Bereich, zu Entwicklungszwecken oder in Umgebungen in denen man Einfluss auf die Stammzertifikate hat, eignen sich diese jedoch sehr gut. Wird eine MSI Datei auf einem Computer installiert, auf dem das entsprechende Stammzertifikat nicht installiert ist, verhält sich der Installer wie oben gezeigt.

Da die erste Erstellung und Signierung ein bisschen Umständlich ist, hier eine kleine Schritt für Schritt Anleitung zum signieren von MSI Files mit CACert Zertifikaten:

  1. Als Assurer bei CACert registrieren
  2. Mindestens 100 Punkte bei CACert sammeln
  3. Die Code-Signing Funktion über den CACert Support explizit freischalten lassen
  4. Mit Firefox über den Menüpunkt “Client Zertifikat” ein neues Zertifikat mit der Option “Code-Zertifikat” erstellen.
  5. Im Firefox über Extras –> Erweitert –> Zertifikat Anzeigen das Zertifikat als PKCS12-Datei speichern

    2010-06-13 01h13_33

  6. Per Doppelklick auf das Zertifikat den Zertifikatimport-Assistenten öffnen und das Zertifikat dem Zertifikatsspeicher hinzufügen
  7. Im Internet Explorer über Extras –> Internetoptionen –> Inhalte –> Zertifikate den lokalen Zertifikatsspeicher öffnen
  8. Das Zertifikat mit dem privaten Schlüssel als PFX-Datei exportieren. Hier noch einmal beachten, das das zu exportierende Zertifikat auch wirklich für den Zweck Codesignierung ausgestellt wurde. Im IE heißt das “Garantiert, dass die Software von einem Software-Herausgeber stammt” 

    2010-06-13 08h05_05
    2010-06-13 08h05_23
    2010-06-13 01h06_31

  9. MSI Datei mit dem Visual Studio erstellen
  10. MSI Datei über die Eingabeaufforderung mit folgendem Befehl signieren

    signtool.exe sign /f MyPfxFile.pfx /p Password /d "Produktname" /du "http://www.ProduktURL.com" "Installer.msi"

Nachdem das Signieren mit “Done Adding Additional Store. Successfully signed: Installer.msi” abgeschlossen wurde, ist die MSI-Datei signiert und die UAC sollte bei der Installation nun wie folgt reagieren:

2010-06-13 08h22_48

An einigen Stellen habe ich explizit auf die Verwendung des Firefox hingewiesen, da ich diese Schritte mit dem IE8 nicht ausführen konnte. Andere Browser wurden von mir an dieser Stelle nicht getestet.

Das Erstellen des eigentlichen Zertifikats ist anfänglich ein bisschen Umständlich, einmal Erstellt geht das Signieren aber sehr einfach von statten. Das Script aus Punkt 10 kann auch über das Visual Studio im Build Prozess automatisiert werden.