Seit dem 1. Februar 2017 kann das EV Code Signing als Mindestanforderung für das Code Signing angesehen werden. Die Zertifikate werden auf USB-Tokens installiert und benötigen Treiber, um zu funktionieren. Mit dem Tool „Signtool.exe“ aus dem Microsoft Windows SDK ist es normalerweise kein Problem, Binärdateien interaktiv zu signieren. Der manuelle Eingriff erfolgt, wenn Signtool versucht, auf das Zertifikat auf dem USB-Token zuzugreifen und der Sicherheitstreiber ein Popup-Fenster zur Eingabe des Token-Passworts aufruft.

In einer Continuous Integration/Continuous Delivery (CI/CD) Build-Umgebung werden die meisten Aufgaben zur Erstellung eines Softwareprodukts automatisiert und von unbeaufsichtigten Build-Agenten ausgeführt. Das bedeutet, dass niemand interaktiv bei dem Agenten angemeldet ist. Solche Agenten sind oft virtuelle Maschinen ohne physischen Monitor oder Tastatur. Wenn EV Code Signing erforderlich ist, wird der Erstellungsprozess unterbrochen oder angehalten, da kein Benutzer das Popup-Dialogfeld sehen kann.

Die Frage „Automate Extended Validation (EV) code signing“ auf stackoverflow.com bietet viele Lösungen, die wir uns jetzt ansehen werden:

1) Verwenden Sie die Treiberoption „Einzelanmeldung aktivieren“.
Dies ist die bevorzugte Antwort der Zertifizierungsstellen. Dies erfordert immer noch, dass sich ein Benutzer beim Build-Agent anmeldet, das Passwort einmal eingibt und dann die Benutzersitzung sperrt. Wenn sich der Benutzer nach einmaliger Eingabe des Kennworts abmeldet, wird die Benutzersitzung geschlossen und der Treiber verwirft das Kennwort. Das bedeutet, dass sich nach jedem Neustart des Betriebssystems jemand bei dem Agenten anmelden muss, bevor Build-Prozesse erfolgreich ausgeführt werden können. Dies ist eine potenzielle Quelle für ärgerliche Fehler.

2) Verwenden Sie ein Tool/Skript, das den Popup-Dialog erkennt und das Kennwort automatisch eingibt.
Dies erfordert ebenfalls, dass ein Benutzer beim Build-Agent angemeldet ist. Andernfalls gibt es keinen GUI-Kontext, um das Dialogfeld anzuzeigen, und das Tool kann es nicht erkennen. Das bedeutet auch, dass eine manuelle Vorbereitung nach einem Neustart des Build-Agenten erforderlich ist.


3) Ersetzen Sie „Signtool.exe“ durch ein Programm, das eine Datei signieren und den USB-Token ohne manuellen Eingriff entsperren kann.
Die Antwort von „draketb“ auf stackoverflow.com bietet den Quellcode zum Erstellen von „etokensign.exe“, das ähnliche Informationen wie „Signtool.exe“ und das Passwort zum Entsperren des Tokens benötigt. Außerdem benötigt es den Containernamen des Zertifikats. Dabei handelt es sich um eine hexadezimale Zeichenfolge, die manuell aus dem USB-Token extrahiert werden muss.

Der letzte Vorschlag ist der einzige, der keine Benutzeranmeldung beim Build-Agent erfordert. Diese Lösung läuft völlig unbeaufsichtigt. Aber dennoch bindet die Notwendigkeit des Containernamens die Build-Pipeline an das USB-Token. Natürlich können Sie eine einfache Skriptdatei auf dem Build-Agent verwenden, um diese Abhängigkeit zu unterbrechen. Sie benötigen dann für jedes Token ein eigenes Skript. Alle Skripte müssen denselben Namen haben, da die Build-Pipeline nicht unterscheiden sollte, auf welchem Build-Agent sie ausgeführt wird. Das macht die Lösungen ein wenig unpraktikabel – oder besser gesagt komplexer als erwartet.


Das war der Grund, warum ich mich entschlossen habe, den Quellcode ein wenig zu ändern. Die Herausforderung bestand darin, das Zertifikat anhand seines Namens zu identifizieren, wie es bei „Signtool.exe“ mit dem Parameter „/n“ gemacht wird.

Klicken Sie auf den folgenden Link, um den Quellcode für „eTokenSign2“ zu erhalten, der einige kleine Änderungen gegenüber dem Quellcode von „draketb“ enthält:

Die Befehlszeilensyntax von eTokenSign2.exe lautet
etokensign.exe <Name des Zertifikats> <Token-PIN> <Zeitstempel URL> <Pfad zur zu signierenden Datei>

Sie können den Quellcode so verwenden, wie er ist. Um Ihre eigene Binärdatei zu erstellen, folgen Sie einfach den Schritten zum Aufbau am Ende des Blogeintrags.

In unserer Produktionsumgebung ist die Binärdatei in eine Skriptdatei verpackt. Daher kennen nur unsere IT-Administratoren die Token-Passwörter.
Die erfolgreiche Signierung kann in den Eigenschaften der signierten Dateien überprüft werden.

Ich hoffe, diese ausführbare Datei hilft Ihnen, Ihre Build-Prozesse in Gang zu bringen, ohne dass Sie manuell eingreifen müssen 🙂 .

Gehen Sie wie folgt vor, um das Binary zu erstellen:

1- Laden Sie die unten stehende Zip-Datei herunter und entpacken Sie sie.
2- Installieren Sie Visual Studio Community 2017 oder die Visual Studio 2017 Build Tools
3- Öffnen Sie eine „Eingabeaufforderung für Entwickler“.
4- Führen Sie „msbuild.exe eTokenSign2.vcxproj /p:Configuration=“Release“ /p:Platform=x86″ aus.

Haftungsausschluss
DIE SOFTWARE WIRD OHNE MÄNGELGEWÄHR ZUR VERFÜGUNG GESTELLT, OHNE AUSDRÜCKLICHE ODER STILLSCHWEIGENDE GEWÄHRLEISTUNG JEGLICHER ART, EINSCHLIESSLICH, ABER NICHT BESCHRÄNKT AUF DIE GEWÄHRLEISTUNG DER MARKTGÄNGIGKEIT, DER EIGNUNG FÜR EINEN BESTIMMTEN ZWECK UND DER NICHTVERLETZUNG VON RECHTEN. UNTER KEINEN UMSTÄNDEN HAFTEN DIE AUTOREN ODER URHEBERRECHTSINHABER FÜR JEGLICHE ANSPRÜCHE, SCHÄDEN ODER SONSTIGE HAFTUNG, SEI ES AUS VERTRAG, UNERLAUBTER HANDLUNG ODER ANDERWEITIG, DIE SICH AUS DER SOFTWARE ODER DER NUTZUNG ODER DEM SONSTIGEN UMGANG MIT DER SOFTWARE ERGEBEN.

Copyright (c) 2018 panagenda

Sofern nicht anders angegeben, ist dieses Werk unter https://creativecommons.org/licenses/by-sa/4.0/ lizenziert.
Es ist ein Derivat, das auf dem Code von „draketb“ auf https://stackoverflow.com/a/47894907 basiert.