Signieren von Programmdateien

Bei bestimmten Programmen soll nachgewiesen werden, dass eine Datei von einem Autor stammt und bei der Übertragung nicht verändert wurde. In der Java-Welt gibt es dazu die Programme jarsigner, keytool und policytool, um ein Zertifikat zu erstellen, welches beim Ausführen z.B. im appletviewer verwendet werden kann, um mehr Rechte zu geben.

Beispielprogramm

1. Folgendes Programm versucht Systemeigenschaften abzufragen
// Test_Sicherheit.java
import java.applet.Applet;
import java.awt.Graphics;

public class Test_Sicherheit extends Applet
{
  public void paint(Graphics g)
  {
    try
    {
       String erg = System.getProperty("os.user"); g.drawString(erg, 10, 20);
    }
    catch (SecurityException ex) { g.drawString(ex.toString(), 10, 20); }
  }
}
2. Übersetzen des Quelltextes:
javac Test_Sicherheit.java
3. JAR-Archiv erstellen:
jar cfv Test_Sicherheit.jar Test_Sicherheit.class
4. Mit keytool eine digitale Signatur erstellen. Hierbei sind folgende Begriffe wichtig:
keystoreSchlüsselring; Datei mit Schlüssel und Zertifikate (Standard .keystore)
alias Bezeichnung eines Schlüssels im Schlüsselring, für Zugriff
storepassum Integrität des Schlüsselrings zu überprüfen
keypassprivaten Schlüssel des Alias verschlüsseln
storetypeTyp des Schlüsselrings (JKS oder JCEKS)
privater SchlüsselZum Signieren, muss geheim bleiben
öffentlicher SchlüsselZum Überprüfen des Unterschrift, allen bekannt
keytool -genkey -keyalg RSA -alias signFiles -keypass pw_schluessel -keystore maxi_keystore -storepass pw_speichern
Es werden dann noch Eingaben verlangt zum Namen, Organisation, Land etc. Die Datei mit dem Schlüssel trägt den Namen "maxi_keystore", und es sind noch 2 Passwörter für das Sichern von Schlüsseln("pw_schluessel") und Passwörtern("pw_speichern") übergeben. Die hier verwendete Schlüsselgröße ist DSA mit 1024 Bits.

5. JAR-Archiv mit digitalen Unterschrift ergänzen:
jarsigner -keystore maxi_keystore -signedjar sTest_Sicherheit.jar Test_Sicherheit.jar signFiles
Das erste Passwort (für keystore) ist dann "pw_speichern", das zweite (für signFiles) ist "pw_schluessel". Die Datei sTest_Sicherheit.jar enthält eine erweitere Manifest-Datei Manifest.mf sowie zwei Signatur-Dateien Signfile.sf und Signfile.dsa .

6. Öffentliche Schlüssel mit keytool erzeugen
keytool -export -keystore maxi_keystore -alias signFiles -file Test_Sicherheit.cer
Man wird noch nach dem Passwort "pw_speichern" gefragt, dann eine Ausgabedatei Test_Sicherheit.cer mit dem öffentlichen Schlüssel angelegt.

Tätigkeiten des Anwenders

Der Anwender erhält das signierte Archiv sTest_Sicherheit.jar und die öffentlicher-Schlüssel-Datei Test_Sicherheit.cer.
1. Der öffentliche Schlüssel der Anwendung muss in die eigene Schlüssel-Datenbank importiert werden:
keytool -import -alias test_s -file Test_Sicherheit.cer -keystore my_keystore
Der Alias für den Schlüssel ist "test_s", und wird in die Datenbank "my_keystore" importiert (Passwort "pw_speichern"). Wenn dem Zertifikat nicht vertraut wird, findet auch keine Übernahme in die Datei my_keystore statt.
2. Prüfen, ob die Signatur passt
jarsigner -verbose -keystore my_keystore -verify sTest_Sicherheit.jar
Es muss dann eine Ausgabe dieses Formats kommen (s = signature was verified, k = Zertifikat gefunden):
smk      574 Thu Jun 16 15:02:24 CEST 2011 Test_Sicherheit.class
3. Für die Ausführung des Applets braucht man die signierte sTest_Sicherheit.jar sowie geänderte Einstellungen bei den Rechten (policy-Datei).
Nach Aufruf des Programms policytool muss man unter Menü "Bearbeiten" --> "Keystore ändern" eintragen:
Neue KeyStore-URL: File:/c:/java/applet/my_keystore
Dann neuer Richtlinieneintrag hinzufügen:
Code-Basis: File:/c:/java/applet
Signiert von (Aliasname): test_s
Dann noch neue Berechtigung hinzufügen: PropertyPermission und Signiert von "test_s"
Die Richtlinien werden dann erfolgreich in c:\Dokumente und Einstellungen\<Benutzer>\.java.policy geschrieben.
4. Anzeige des Zertifikats
keytool -list -rfc -alias test_s -keystore my_keystore
Keystore-Passwort ist "pw_speichern". Das Zertifikat ist dann zwischen den Markierungen -----(BEGIN|END) CERTIFICATE-----
5. Die Zertifikatsfingerabdrücke (MD5, SHA1) lassen sich folgenderxma¨en anzeigen:
keytool -printcert -v -file Test_Sicherheit.cer

Exkurs: Optionen von keytool (java 1.5)