Code Signing für eigene Programme (Software-Zertifikat)

Für alles, was in den übrigen Lazarusthemen keinen Platz, aber mit Lazarus zutun hat.
Antworten
Benutzeravatar
Jorg3000
Lazarusforum e. V.
Beiträge: 385
Registriert: So 10. Okt 2021, 10:24
OS, Lazarus, FPC: Win64
Wohnort: NRW

Code Signing für eigene Programme (Software-Zertifikat)

Beitrag von Jorg3000 »

Moin!

Hier: Wie man seine Programme mit einem Software-Zertifikat signiert (Code Signing), mit einem Beispiel für Windows in meiner Pascal-Unit.
Gesucht wird eine Umsetzung für Mac. Kann dasselbe Zertifikat für Windows und Mac verwendet werden? (ich vermute: ja)

Ich wurde per Privatnachricht gefragt, ob ich Code-Signing erklären kann. Gerne, hier als öffentliche Antwort. Da ich selbst jedoch nur Windows nutze, wird noch nach Erfahrung auf'm Mac gesucht.
Für nur intern verwendete Programme hat das teure Zertifkat kaum einen Mehrwert, aber wer seine Programme per Webseite zum Download anbietet, sollte über ein Software-Zertifikat nachdenken.

Mittels Code-Signing wird das eigene Zertifikat an eine Programmdatei (.EXE .DLL .MSU) angehängt. Darin ist ein Hash des Programmcodes enthalten, d.h. der Empfänger kann prüfen, ob die Datei unverändert ist oder z.B. böswillig manipuliert wurde, z.B. zwischenzeitlich auf dem Webserver befallen oder ausgetauscht wurde. Der eingebettete Hash ersetzt das frühere Handling von MD5-Prüfsummen, die man manuell abgleichen musste.
Zudem wird der Herausgeber namentlich angezeigt. Der Nutzer kann also prüfen, ob er eine unveränderte Original-Datei des Herausgebers erhalten hat.

Als Erstes benötigt man ein spezielles "Code Signing Certificate", das es in der "OV"-Version für normale Anwendungen gibt, und als "EV" auch für Kernel-Mode Driver.
Ein solches Zertifikat bekommt man z.B. bei Thawte oder Comodo. 2020 habe ich noch "nur" 80€/Jahr dafür hinblättern müssen, aber jetzt sehe ich gerade, dass der Preis auf rund 400€/Jahr gestiegen ist. Oh wow!
Ich habe mein Zertifikat vor 2 Jahren über ksoftware bestellt, wo es aktuell mindestens $219/Jahr kostet: https://www.ksoftware.net/code-signing-certificates/
Hinzu kommen neuerdings noch $130 für den Versand eines Token. Macht zusammen knapp $800 für 3 Jahre. Bei den Preisen muss man vermuten, dass der Token aus Gold ist und dass jede Zahl des Zertifikats von einem menschlichen Rechenkünstler von Hand erstellt wird. :lol:

Nach der Bestellung erhält man eine .PFX-Datei, die mit einem eigenen Passwort verschlüsselt ist.
Ich kann mich dunkel erinnern, dass man die .PFX-Datei aus dem Browser exportieren musste, weshalb man den Browser auf keinen Fall schließen durfte ohne zu speichern. Herzklopfen für damals 80€.

Unter Windows benötigt man das signtool.exe, das nicht standardmäßig bei Windows dabei ist, sondern mit der Windows SDK installiert wird, siehe: https://developer.microsoft.com/de-de/w ... ndows-sdk/
Der SDK-Installer bietet 3,7 GB Zeugs an, das man zum Glück alles abwählen kann, außer den "Windows SDK Signing Tools für Desktop Apps" (nur 1,6 MB).
Nach der Installation findet man das signtool.exe an einem nicht festgelegten Pfad irgendwo im Programme-Ordner.

Das Signtool ist ein Kommandozeilenprogramm, das rund 30 Parameter kennt. Super.
Deshalb habe ich eine Unit geschrieben, welche die Parameter zusammenbastelt (7 werden mindestens benötigt) und das Signtool aufruft.
Weiter im nächsten Beitrag ...
Zuletzt geändert von Jorg3000 am So 25. Jun 2023, 15:12, insgesamt 2-mal geändert.

Benutzeravatar
Jorg3000
Lazarusforum e. V.
Beiträge: 385
Registriert: So 10. Okt 2021, 10:24
OS, Lazarus, FPC: Win64
Wohnort: NRW

Re: Code Signing für eigene Programme (Software-Zertifikat)

Beitrag von Jorg3000 »

Meine Unit für Windows

Die Unit braucht NICHT in das zu signierende Programm eingebunden werden, sondern dient lediglich als Hilfe, damit man das Kommandozeilenprogramm signtool.exe mit den vielen Parametern nicht von Hand aufzurufen braucht.

Die schlanke Unit benötigt 3 Konstanten: Den Pfad zum signtool.exe, den Pfad zur gekauften .PFX-Datei und das persönliche Passwort zur PFX-Datei.
Dann ruft man die Funktion signFile() unter Angabe des Ziel-Dateinamens auf, z.B. einer eigenen .EXE oder .DLL.

Ich habe absichtlich darauf verzichtet die Funktionen in eine Klasse zu packen, da ich davon ausgehe, dass man die o.g. 3 Angaben einfach wie Konstanten hinterlegen möchte.

Ob das Signieren geklappt hat, prüft die Funktion checkFile(), indem sie am Ende der Zieldatei nach einem Signatur-typischen Merkmal sucht. Die Funktion kann aber nicht beurteilen, ob die Signatur wirklich gültig ist, d.h. ob der Hash noch zum Programmcode passt.

Für meine eigenen Experimente war die Funktion damageFile() gedacht, die ein Byte in der signierten Datei verändert. Ich wollte wissen, wie Windows auf einen nicht mehr passenden Hash reagiert.
Ernüchterung: Windows startet das manipulierte Programm trotzdem - und auch der Virenscanner zeigt "Keine Probleme gefunden". Ach.
Der geneigte Endanwender muss also selber tätig werden, indem er mit rechter Maustaste die Eigenschaften zu der Datei aufruft, dann auf den Reiter "Digitale Signaturen" geht und dann noch auf die Signatur doppelklickt, um endlich angezeigt zu bekommen, ob die Signatur gültig ist oder nicht.
Dieses Wissen kann man bestenfalls von einem Admin verlangen. Ich hatte gehofft, dass Windows ohne Zutun Alarm schlägt und die Ausführung der Datei unterbindet. Wenigstens wird bei meiner manipulierten Datei tatsächlich angezeigt, dass die Signatur nicht gültig ist.

Grüße, Jörg
Dateianhänge
CodeSigning.pas
(4.82 KiB) 63-mal heruntergeladen
Zuletzt geändert von Jorg3000 am So 25. Jun 2023, 15:13, insgesamt 1-mal geändert.

paweld
Beiträge: 91
Registriert: So 11. Jun 2023, 16:01
OS, Lazarus, FPC: Lazarus trunk, FPC fixes

Re: Code Signing für eigene Programme (Software-Zertifikat)

Beitrag von paweld »

Es gibt ein Plugin für Lazarus, mit dem Sie Anwendungen aus der IDE heraus signieren können: https://www.ccrdude.net/LazCodeSigningHelper/
Grüße / Pozdrawiam
paweld

Antworten