Table of contents
Open Table of contents
Das Problem
Das signtool.exe
ist ein Programm um andere ausführbare Dateien digital zu signieren. Um eine Datei zu signieren, ist es notwendig ein entsprechendes Zertifikat (Code Signing Zertifikat) zu haben.
Beispielhaft möchten wir das PowerShell Skript test.ps1
signieren.
Von einem Tag auf den andere konnte ich aber auf einer Maschine nicht mehr signieren, folgender Fehler:
C:\Program Files (x86)\Windows Kits\10\bin\10.0.22621.0\x64>signtool.exe sign /s my /fd SHA256 /ph /td SHA256 /tr http://timestamp.digicert.com C:\Temp\signing\test.ps1
Done Adding Additional Store
SignTool Error: An error occurred while attempting to load the signing
certificate from: C:\Temp\signing\test.ps1
Was diese Parameter genau machen, findet sich hier: signtool.exe Parameter
Troubleshooting
Das signtool.exe
ist nicht gerade bekannt für ausführliche Fehlermeldungen oder Erklärungen.
Es gibt für signtool.exe /sign
den /debug
Parameter. Das kann in manchen Szenarien hilfreich sein, wenn man wissen will welches Zertifikat ausgewählt wird. Aber im Endeffekt resultiert das für uns in der gleichen Fehlermeldung.
Meines Wissens gibt es kein zusätzliches “debug error logfile” oder ähnliches. Sehen wir uns den Fehler an:
SignTool Error: An error occurred while attempting to load the signing certificate from: C:\Temp\signing\test.ps1
Die Fehlermeldung ist durchaus irritierend, weil die Fehlermeldung sagt es würde gern das Signing Zertifikat von der Datei (die wir eigentlich signieren möchten) laden. Das macht für mich nicht viel Sinn.
Es gibt durchaus einige Diskussionen über den Fehler:
- https://learn.microsoft.com/en-us/answers/questions/1324584/signtool-unable-to-load-signing-certificate
- https://github.com/electron-userland/electron-builder/issues/816
- https://github.com/electron/windows-installer/issues/32
Aber all das führte zu keiner Lösung meines Problems.
Aktueller Status
Was wissen wir über die aktuelle Situation:
- Das Code Signing Zertifikat selbst ist in Ordnung (funktioniert auf anderen Clients)
- Meine Verwendung (CLI Parameter) des
signtool.exe
ist in Ordnung (funktioniert genau so auf anderen Clients)
Der einzige manuelle Prozess in meinem Szenario ist das Importieren des Code Signing Zertifikats in den Zertifikatsstore.
Importieren des Zertifikats
Wir wissen aufgrund der /debug
Ausgabe, dass das Code Signing Zertifikat grundsätzlich gefunden und auch ausgewählt wird. Sehen wir uns an, welche Optionen es gibt:
Include all extended properties
ist bereits ausgewählt vom Wizard.
Das ist der einzige Schritt wo wir Änderungen vornehmen können, der Rest des Wizard gibt keinen Spielraum für Abweichungen.
Wenn wir den Wizard nun fertig durch klicken mit den oben gesetzten Einstellungen, funktioniert das signieren wieder.
Hier eine Übersicht welche Varianten ich probiert habe (es sind einfach die Option der Reihenfolge wie im Screenshot):
----------------------
[ ]
[ ]
[ ]
[x]
----------------------
[x]
[x]
[ ]
[x]
----------------------
[x]
[x]
[ ]
[ ]
----------------------
[ ]
[ ]
[x]
[x]
----------------------
[x]
[ ]
[ ]
[x]
----------------------
[ ]
[ ]
[x]
[ ]
----------------------
[ ]
[ ]
[x]
[x]
----------------------
[x]
[ ]
[ ]
[ ]
----------------------
[x] -----> ERROR CASE
[ ]
[x]
[x]
----------------------
[x] -----> ERROR CASE
[ ]
[x]
[ ]
----------------------
Sobald wir nur die oberste Option auswählen, erhalten wir:
Wenn wir nur die dritte Option auswählen, erhalten wir keinen zusätzlichen Prompt.
Wählen wir die erste und dritte Option aus, erhalten wir folgenden Dialog:
Sobald ein Passwort vergeben wird, können wir kein signing mehr machen. Sobald wir also die Option Require a password with this key
deselektieren, funktioniert auch diese Variante.
Let’s call it a day
Bedeutet das, dass das generell nicht funktioniert? Definitiv nicht. Auf anderen Maschinen kann ich diese Option nutzen (und ursprünglich auch auf der “Problem-Maschine”) und bekomme auch tatsächlich jedes mal eine Abfrage beim signieren. Ich habe versucht näheres herauszufinden, konnte aber auf die schnelle nicht erkennen was das Problem ist. Sowohl das signtool.exe
als auch das äquivalente PowerShell Set-AuthenticodeSignature
liefern keine guten Fehlermeldungen.
Mittels procdump.exe
kann man sehr einfach Exception ausgeben lassen die von einem Programm erzeugt werden, wenn wir das also mit dem signtool.exe
machen mit folgenden CLI:
C:\Program Files (x86)\Windows Kits\10\bin\10.0.22621.0\x64>C:\Temp\SysinternalsSuite\procdump.exe -e 1 -f "" -w signtool.exe
ProcDump v11.0 - Sysinternals process dump utility
Copyright (C) 2009-2022 Mark Russinovich and Andrew Richards
Sysinternals - www.sysinternals.com
Waiting for process named signtool.exe...
Process: signtool.exe (8828)
Process image: C:\Program Files (x86)\Windows Kits\10\bin\10.0.22621.0\x64\signtool.exe
CPU threshold: n/a
Performance counter: n/a
Commit threshold: n/a
Threshold seconds: n/a
Hung window check: Disabled
Log debug strings: Disabled
Exception monitor: First Chance+Unhandled
Exception filter: [Includes]
*
[Excludes]
*
Terminate monitor: Disabled
Cloning type: Disabled
Concurrent limit: n/a
Avoid outage: n/a
Number of dumps: 1
Dump folder: C:\Program Files (x86)\Windows Kits\10\bin\10.0.22621.0\x64\
Dump filename/mask: PROCESSNAME_YYMMDD_HHMMSS
Queue to WER: Disabled
Kill after dump: Disabled
Press Ctrl-C to end monitoring without terminating the process.
[16:16:10] Exception: E06D7363.?AVcapilib_error@@
[16:16:10] Exception: E06D7363.msc
[16:16:10] Exception: E06D7363.msc
[16:16:10] Exception: E06D7363.?AVcapilib_error@@
[16:16:10] Process Exit: PID 8828, Exit Code 0x00000001
[16:16:10] The process has exited.
[16:16:10] Dump count not reached.
Wenn das signtool.exe
funktioniert, sieht das Ende so aus:
[16:21:57] Process Exit: PID 11800, Exit Code 0x00000000
[16:21:57] The process has exited.
[16:21:57] Dump count not reached.
Der Exception Code E06D7363
ist eine Art “generische Fehlermeldung” siehe den Blogbeitrag von Raymond Chen.
Wir haben einen Workaround gefunden - die Root Cause des Problems ist noch ungeklärt und eventuell etwas für ein anderes mal…
Happy Troubleshooting.