Code Signierungszertifikat

Ein Code Signierungszertifikat (engl.: Code Signing Certificate) macht bei jeder Anwendung Sinn, die von anderen genutzt wird. Insbesondere ist dies der Fall bei Download-Anwendungen für  Kunden. Aber was macht diese Code Signierung eigentlich? Nun, damit „unterschreibt“ man die Anwendung, sodass Informationen mit der Anwendung ausgeliefert werden, welche angeben wo diese Software herstammt und wer diese entwickelt hat. Auf diese Weise sollen Modifikationen an der Software vermieden werden und ebenso soll sichergestellt werden, dass die Anwendung keinen Schadcode enthält. Aber wo bekommt man ein solches Zertifikat? Theoretisch kann jeder Herausgeber von Zertifikaten (z.B. Thawte, VeriSign, Globalsign, StartSSL) auch Code Signierungszertifikate ausstellen. In welchen Paketen dort Code Signierungszertifikate enthalten sind, sollte natürlich zuvor ermittelt werden. 

Erstellen des Code Signierungszertifikat

Zunächst einmal sollten wir uns einen privaten Schlüssel für unser Zertifikat erstellen. Hierzu benötigen wir eine lauffähige OpenSSL Installation. Die verwendeten Kennwörter sollten entsprechend sicher gestaltet werden und im Idealfall mehr als 20 Zeichen besitzen. Starten wir also eine Konsole und gehen in das OpenSSL-Verzeichnis (oder nutzen hierzu einen Server mit SSH-Shell). Anschließend benötigen wir die folgenden zwei Befehle, um den privatem Schlüssel für das Zertifikat sowie den „Certificate Signing Request“ zu erstellen:

openssl genrsa -des3 -out Signing.key 4096
openssl req -new -key Signing.key -out Signing.csr

Die Datei „Signing.key“ enthält nun unseren privaten Schlüssel, den wir unter allen Umständen geheim halten müssen. In der Datei „Signing.csr“ hingegen steht unter „Certificate Signing Request“ womit wir bei einer Zertifizierungsbehörde wie z.B. StartSSL nun unser Code Signierungszertifikat beantragen können. Bei StartSSL geht man nun wie folgt vor: Einloggen / Certificate Wizard / Object Code Signing Certificate. Anschließend den Inhalt der *.csr-Datei einfügen und dafür das *.crt erhalten, welches das Signierungszertifikat darstellt (allerdings noch nicht vollständig zur Verwendung ist).

Öffentlichen und privaten Schlüssel für den Signaturvorgang kombinieren

Nun müssen wir unseren privaten Schlüssel sowie das gerade heruntergeladene Zertifikat miteinander kombinieren. Dies geht mit folgendem Befehl in der Konsole:

openssl pkcs12 -export -out Signing.pfx -inkey Signing.key -in Signing.crt

Nun haben wir ein „Signing.pfx“, welches wir nun mit dem Microsoft Tool „signtool.exe“ verwenden können. Um unsere Anwendung nun zu signieren (im Beispiel „Anwendung.exe“), benötigen wir nun folgendem Befehl:

signtool.exe sign /f Signing.pfx /p <PASSWORD> /tr "http://www.startssl.com/timestamp" Anwendung.exe

Durch die Verwendung von /tr „http://www.startssl.com/timestamp“ als Parameter wird das jetzige Datum und die Uhrzeit durch StartSSL signiert und in die ausführbare Datei geschrieben. Der Sinn liegt darin, dass eine Datei auch dann gültig signiert sein soll, wenn das verwendete Zertifikat abgelaufen ist – solange nur der Signaturvorgang innerhalb des Gültigkeitszeitraums des Zertifikats durchgeführt wurde.

Wichtig ist es jetzt nur, die beiden Dateien „Signing.key“ sowie „Signing.pfx“ geheim zu halten, da beide den geheimen privaten Schlüssel enthalten. Ob die Signierung geklappt hat, kann über die Eigenschaften der signierten Datei geprüft werden (Rechtsklick / Eigenschaften).

Edit: Da das Microsoft Tool „signtool.exe“ anscheinend Probleme mit dem StartSSL-Zeitserver hat, wäre der Zeitserver von Globalsign, „http://timestamp.globalsign.com/scripts/timestamp.dll“, als Alternative natürlich auch möglich.