Tech-Ecke / Delphi Inhalt / Code Signierung

 

     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.

 
 

Die Option Drucken funktioniert erst ab Netscape V4.0 bzw. I-Explorer 5.0 !

[letzte Aktualisierung 11.02.2024]