Code Signierung mit OpenSSL und
MS SignTool
Was ist Code Signierung bzw. Code Signing?
Kurz und knapp: Man verpasst seiner selbst geschriebenen
Anwendung eine digitale Unterschrift. Anhand derer kann man
erkennen von wem diese Software stammt. Ist Windows diese
Unterschrift bekannt, so geniest die Anwendung vollstes
Vertrauen.
Wie mache ich meine Unterschrift bei Windows bekannt?
Man benötigt hierzu ein gegengezeichnetes, verschlüsseltes
Signierungszertifikat von einem anerkannten Anbieter wie z.B.
Comodo, DigiCert und Sectigo, um mal drei aus der Riege der
bekanntesten zu nennen. Allerdings bekommt man so ein
vertrauenswürdiges Zertifikat nicht umsonst, man muss hier mit
200 EUR pro Jahr und mehr rechnen (2022). Pro Entwickler
benötigt man jedoch nur ein Zertifikat und kann damit dann alle
seine Anwendungen signieren.
Geht das auch kostenlos?
Ich sage mal Jain. Ja, man sich ein verschlüsseltes Zertifikat erstellen und selbst gegenzeichnen. Das Ganze nennt sich
dann ein "Self Signed Certificate". Windows wird dieses selbstsignierte Zertifikat jedoch nicht als
vertrauenswürdig einstufen
und somit ist auch die digitale Unterschrift der Anwendung
erstmal nichts wert. Aber, Importiert man das Self Signed
Certificate in Windows unter "Vertrauenswürdige Zertifikate", dann
wird auch die Signatur der Anwendung als vertrauenswürdig
eingestuft. Dieses Prozedere muss dann aber an jedem Zielrechner erfolgen
und wird ein Admin auch nur dann tun, wenn er dein vollstes
Vertrauen geniest. Möchte man seine Software also nur einer
begrenzten Anzahl an Nutzern weitergeben, so wäre dies eine
Möglichkeit die Windows-Schutzgötter milde zu stimmen.
Für große Softwareschmieden ist das Signieren mittels
vertrauenswürdigem Zertifikat quasi zu einem Muss geworden. Eine nicht signierte Anwendung wird von Windows immer
unter Generalverdacht gestellt. Versucht diese dann auch noch
Einstellungen auf dem Computer zu verändern, dann reagiert
Windows mit einer eindringlichen Warnmeldung, welche wohl viele
potenziellen Nutzer davon abhalten wird die Software auszuführen
bzw. überhaupt erst zu installieren.
Meine persönliche Meinung:
Eine Signatur auf Basis eines vertrauenswürdigem Zertifikat
garantiert jedoch nicht, dass es sich am Ende doch um eine
bösartige und schädliche Software handelt. Zum einen behält eine
veränderte Anwendung ihre Signatur wohl bei, zumindest konnte
ich bei einer signierten Anwendung die Ressourcen tauschen, ohne
das die Signatur verloren ging. Das hat mich ehrlich gesagt ein
wenig stutzig gemacht und mein Vertrauen in Signierte Anwendungen stark getrübt. Zum anderen gibt es Berichten
zu folge wohl Zertifikataussteller, die nur eine lapidare
Authentifizierung vornehmen, solange der Besteller
gut zahlt. Am Ende ist es also einfach nur eine weitere
Hürde die ein Hacker nehmen muss. Dass das Konzept jedoch
in Frage gestellt wird bezweifele ich sehr, denn zu viele
verdienen gutes Geld mit der Sache. Ich betrachte eine Signatur
mittlerweile fast als reine Systembefriedigung mit
angeschlossener Gelddruckmaschine und nicht als wirkungsvollen
Schutz. Hoffentlich irre ich mich einfach nur...
So geht's
Wie auch immer, hier zeige ich mal wie eine Signatur mit einem
Self Signed Certificate von statten gehen kann. Dazu benötigt
wird:
- OpenSSL
- MS SignTool
- ist Bestandteil des
Windows SDK Pakets und
gibt's hier. Am besten über den Online-Installer
eine benutzerdefinierte Installation starten und nur SignTool auswählen, ansonsten hat man ca. 4 GB weniger
Platz auf der Festplatte. SignTool selbst begnügt sich
mit nur wenigen MB.
- TE SignTool GUI -
gibt's hier
Hat man OpenSSL herunter geladen
und entpackt, so pflanzt man da noch die Konfigurationsdatei "openssl.cnf"
und die entpackte Batchdatei "--- StartMich ---.bat" hinein.
SignTool installiert sich, je nach Betriebsystem und Version in
einem
Verzeichnispfad der in etwa so aussehen sollte: "C:\Program Files
(x86)\Windows Kits\10\bin\10.0.19041.0\x86". Wer will kann sich
den Ordner auch wo anders hinkopieren und die SDK-Installation
wieder entfernen - so macht man eine Portable App :-) Der Inhalt
beider
Verzeichnisse sollten so aussehen, Pfad ist egal, man kann auch
beides in einen Topf werfen:
Als erstes wird die benötigte
Zertifikatsdatei (.pfx) mittels "--- StartMich ---.bat" erzeugt.
Vor dem Start der Batchdatei kann man darin noch folgende drei
Dinge anpassen: Zertifikatsname, Schlüsselgröße und
Gültigkeitsdauer.
Nachdem die Batchdatei
gestartet wurde, folgt man den Anweisungen auf dem Bildschirm. Da
die einzelnen Schritte zum Erstellen der PFX-Datei
hintereinander ablaufen,
erscheint die Passwort-Vergabe und Eingabe etwas merkwürdig,
aber einfach die Schritte abarbeiten, bis am Ende eine PFX-Zertifikatsdatei rauspurzelt. Hier sind die Schritte
aufgelistet:
- OpenSSL (alles über
Batchdatei)
- 1.) Privater Schlüssel
erstellen (private key - .key)
- Passwort für
Schlüssel angeben (Eingabe nicht sichtbar!)
- Passwort wiederholen
- 2.) Zertifikatsanfrage
Datei erstellen (Certificate Sign Request - .csr)
- und ein drittes mal
das Passwort vom Schlüssel eingeben
- Ländercode eingeben
-> "DE" für Deutschland
- Bundesland eingeben
-> z.B. "RLP" für Rheinland-Pfalz
- Stadt, Ortschaft
angeben -> z.B. Mainz
- Firmennamen oder
Webadresse oder sonst was angeben
- Abteilung oder sonst
was angeben
- Common Name -> Der
Name erscheint im Zertifikat
- Emailadresse angeben
- Challenge Passwort
angeben (nicht der vom Schlüssel, irgend was neues)
- Noch mal optionaler
Firmennamen oder sonst was angeben
- 3.) Signieren und
Zertifikat erhalten (Certificate .crt)
- und wieder Passwort
vom Schlüssel eingeben (wieder nicht sichtbar!)
- 4.) Zertifikat in
PFX-Datei für SignTool wandeln (.pfx)
- und weil's so Spaß
macht gleich noch mal Passwort vom Schlüssel
- jetzt ein Export
Passwort eingeben oder einfach "Eingabetaste"
drücken
- und das Export
Passwort noch mal wiederholen oder halt einfach
"Eingabetaste"
- geschafft, Hurrraaaa
das PFX ist da !!!
Ist die Zertifikatsdatei
erstellt, kann entlich die eigene Anwendung mit SignTool signiert
werden. Am einfachsten geht dies mit TE SignTool GUI. Hier die
Schritte:
- MS SignTool
- Programm mit PFX-Datei
signieren
- TE SignTool GUI
starten
- Pfad zum MS SignTool
angeben
- Pfad zur PFX-Datei
angeben
- Eigene Anwendung per
Drag&Drop in das Fenster von TE SignTool GUI ziehen
In der Batchdatei sind die
einzelnen Schritte einfach zu erkennen und bei Bedarf auch manuell
nachvollziehbar. Der Syntax für das Signieren mittels MS SignTool sieht wie folgt aus:
signtool sign
/f Mein.pfx /tr http://timestamp.digicert.com /fd SHA256
Meine.exe
Es gibt
verschiedene Zeitstempel-Server die genutzt werden können, google zeigt einem welche es noch gibt. Man kann den
Zeitstempel auch weglassen, dann entsprechend "/t
http://timestamp.digicert.com" rausnehmen. Aber: Ein
Zeitstempel ist erforderlich, damit die Gültigkeit des Codes
nicht mit der Gültigkeitsdauer des Code Signing-Zertifikats
abläuft.
Hat man eine
passwortgeschützte PFX, so müsste man noch "/p MeinPasswort" als
Option hinzufügen.
Zertifikat auf Zielrechner installieren
Wirft man jetzt einen Blick in die
Eigenschaften der Exe-Datei, so ist der Reiter
"Digitale Signaturen" hinzugekommen. Aber die Signatur
ist mit dem Self Sign Certificate aktuell noch wertlos, da
Windows das Zertifikat als nicht vertrauenswürdig einstuft.
Man kann jetzt
allerdings das Zertifikat auf dem Rechner als vertrauenswürdig
installiere. Dazu selektiert man zunächst die
Signatur, klickt dann auf [Details], dann auf [Zertifikat anzeigen] und
auf [Zertifikat installieren...].
Dann wählt man "Lokaler Computer"
aus und klickt [Weiter], im nächsten Fenster "Alle Zertifikate
im folgendem Speicher speichern" wählen und auf [Durchsuchen...]
klicken. In der Auswahl "Vertrauenswürdige
Stammzertifizierungsstellen" markieren und [OK]. Zum
Abschluss im letzten Fenster auf [Fertig stellen] klicken und
dieser Rechner vertraut nun dem Zertifikat.
Schaut man sich nun das Zertifikat
in den Eigenschaften der Anwendung an, so wird es von Windows
als gültig anerkannt.
Das trifft natürlich auf alle
Anwendungen zu, die mit dem gleichen Zertifikat signiert wurden.
|