SHA1 und SHA256 Codesigning mit SIGNTOOL und einem Timestamp

Ihr seid vielleicht auch betroffen und nutzt bisher Code Signing für Eure Software oder MSI Pakete.
Ich zumindest habe von Symantec (ehemals Verisign) für unsere Zertifikate zum Jahresende eine Email bekommen, die mir empfiehlt zukünftig sowohl SHA1 als auch SHA256 zu nutzen. Entsprechende Links wurden mitgeliefert. (1) (2)(3)(4)

Ich habe also erstmal das bisherige Codesigning SHA1 Zertifikat als SHA256 Zertifikat neu ausgeben lassen. Das ganze war kostenlos über die Symantec Seite möglich und dauerte letzten Endes höchstens 30 Minuten.

Dann habe ich das neue Zertifikat im Produktionsserver installiert.
In unserem Produktionsprozess ist das Codesigning integriert. Die entsprechenden Dateien liegen in einem Quellordner und werden von unserem Produktionserver verwendet um daraus unsere Installationspakete oder Hotfixes zu generieren. Dabei werden alle Dateien entsprechend automatisch signiert.

Die entsprechende Code Passage in unserem Batch sah bisher so aus:

>signtool sign -sha1 FingerPint-SHA1-Zertifikat -fd sha1 -t http://timestamp.verisign.com/scripts/timstamp.dll myexe.exe

Da dachte ich: OK Ganz einfach, also nur eine zweite Zeile mit dem Parameter -as hinzufügen und das neue Zertifikat angeben.
Aber Pustekuchen:

>signtool sign -as -sha1 FingerPint-SHA256-Zertifikat -fd 256 -t http://timestamp.verisign.com/scripts/timstamp.dll myexe.exe
Done Adding Additional Store
SignTool Error: SignedCode::Sign returned error: 0x80070057
        Falscher Parameter.
SignTool Error: An error occurred while attempting to sign: AGVIP.exe

🙁 Nach einigem hin und her probieren und Lesen einiger Artikel, musste ich feststellen, dass die Ursache einzig und alleine in dem angegebenen Timestamp Server liegt. Der Verisign Timestamp Server mag einfach keine SHA256 Zertifikate für das Gegenzeichnen.

Die Lösung war also einfach. Ich habe einen anderen Timestamp Server benutzt und nun sehen die Befehlszeilen einfach so aus.

>signtool sign     -sha1 FingerPint-SHA1-Zertifikat   -fd sha1   -tr http://timestamp.geotrust.com -td sha1   myexe.exe
>signtool sign -as -sha1 FingerPint-SHA256-Zertifikat -fd sha256 -tr http://timestamp.geotrust.com -td sha256 myexe.exe

Und siehe da 🙂 alles funktioniert bestens und meine Programme haben nun 2 Zertifikate.

8 Gedanken zu „SHA1 und SHA256 Codesigning mit SIGNTOOL und einem Timestamp“

  1. c’t 1/2016 S. 174, SHA1, keine Kollisionsresistenz, man sollte SHA256 nehmen :-),
    dieser Blog-Eintrag hat mich nur an den Heise-Artikel erinnert 🙂

    Michael

  2. das ein anderer timestamp server fuer SHA-256 benutzt werden muss, steht in der Anleitung.

    Zusaetzlich ist zu erwaehnen, dass die Signierung mit SHA-256 mit VisualStudio nur mit .NET 4.5 Assemblies einfach funktioniert.

  3. Ist der SHA1-Timestamp eigentlich noch erforderlich, wenn die signierte Software nur noch unter Windows 7 oder höher läuft? Reicht da nicht auch der SHA256-Timestamp?

  4. Da muss ich Dich leider korrigieren. Ein Zeitstempel bei der Signierung sorgt dafür, dass die Signatur auch nach dem Ablauf des Zertifikats als gültig erkannt wird. Ohne Zeitstempel wird eine heute signierte Software nach Ablauf des Zertifikats wie eine nicht signierte Software behandelt.

    1. Upps. Stimmt. Musste es eben noch mal nachlesen. Ich oute mich gerade mal wieder als Trottel 🙁
      Aber, dann ist das eigentlich auch klar, dass man beide benötigt. Denn der Zeitstempel ist ja ein Teil des entsprechenden Zertifikates. Der Timestamp ist ja ein durch das Gegenzertifikat des entsprechenden Zeitservers geschützt.
      Es muss ja nicht sein, dass beide Zertifikate den gleichen Namen haben.

  5. Vorraussetzung für das Dual-Signing mit SHA-1 / SHA-256 ist übrigens die SignTool.exe aus dem Win 8.1 SDK (oder neuer).

    Versucht man diese auf älteren Win Versionen (Vista, 7) auszuführen, kommt es allerdings zu Fehlermeldungen.
    Wenn man folgende Dateien aus dem SDK mitkopiert, kann man die neue SignTool.exe aber auch auf älteren Systemen ausführen:

    signtool.exe
    signtool.exe.manifest
    mssign32.dll
    wintrust.dll
    Microsoft.Windows.Build.Signing.mssign32.dll.manifest
    Microsoft.Windows.Build.Signing.wintrust.dll.manifest

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.

This site uses Akismet to reduce spam. Learn how your comment data is processed.