15.1.7 | Signieren von JAR-Dateien |
Dieser Abschnitt gibt eine kurze Anleitung, wie JAR-Dateien signiert werden können, um Signatur-bezogene Permissions zu vergeben. Diese Vorgehensweise ist für signierte Applets aber auch für Teile von Applikationen, die unter einem SecurityManager laufen, gleichermaßen gültig. Im Einzelnen sind folgende Schritte erforderlich:Die Generierung des Schlüsselpaars, mit dem später die Signatur erfolgt, wird mit dem keytool durchgeführt. Standardmäßig wird die Schlüsseldatenbank als Passwort-geschützte Datei im Homeverzeichnis des Benutzers unter dem Namen .keystore angelegt (unter Windows im Verzeichnis des Benutzerprofils). In einem Keystore werden die Einträge mit einem Aliasnamen identifiziert. Das folgende Kommando erzeugt eine neues Schlüsselpaar unter dem Alias »duke«:
- Mit dem keytool muss ein Schlüsselpaar generiert werden
- Es muss ein Zertifikat für dieses Schlüsselpaar beantragt und importiert werden. Für Testzwecke kann hier auch ein selbstsigniertes Zertifikat eingesetzt werden.
- Der Code, der die besonderen Berechtigungen erfordert, muss in einer JAR-Datei archiviert werden. Anschließend wird diese Datei mit dem jarsigner signiert.
- Abschließend ist die Policy-Regel zu definieren, die für den betreffenden Signierer die Berechtigungen gewährt.
keytool -genkey -alias dukeNach der Eingabe dieses Kommandos werden noch Angaben zum Schlüsselinhaber abgefragt. Diese werden als Benutzeridentifikation im automatisch erzeugten selbst signierten Zertifikat eingetragen. Dieses selbst signierte Zertifikat kann man sich in eine Datei exportieren und mit einem zweiten Kommando anzeigen lassen:keytool -export -alias duke -file selfsigned.crt keytool -printcert -file selfsigned.crtDieses selbstsignierte Zertifikat genügt bereits, um für Testzwecke Signierer-bezogene Berechtigungen auszuprobieren. Im Produktivbetrieb sollte aber ein Zertifikat einer bekannten Certification Authority (CA) vorhanden sein. Um ein solches Zertifikat zu erhalten, sind zwei Schritte durchzuführen:Als nächstes ist die JAR-Datei zu erstellen, die den Code enthält, der die besonderen Privilegien benötigt. Hierzu wird das jar-Kommando ausgeführt, das ausführlich im Anhang B.3 beschrieben wird:
- Es muss ein Zertifikatsantrag für das Schlüsselpaar im Keystore erstellt werden, der an die CA übermittelt wird. Die CA prüft diesen Antrag gemäß ihren Richtlinien und erteilt dann das Zertifikat. Der Zertifikatsantrag kann mit dem folgenden Kommando generiert werden:
keytool -certreq -alias duke -file certrequest.pemDie so erzeugte Datei muss dann zusammen mit weiteren Daten, die von der CA gewünscht werden, an diese übermittelt werden.- Hat die CA das Zertifikat ausgestellt, wird es zugeschickt oder kann heruntergeladen werden. Dann muss es noch in den Keystore importiert werden. Dies erfolgt mit:
keytool -import -alias duke -file cert.crtjar cvf test.jar ».class-Dateien«Dabei ist darauf zu achten, dass sich die Paketstruktur auch in der Verzeichnisstruktur in der JAR-Datei wiederspiegelt, d. h., dass der Bytecode der Klasse de.demo.MyClass mit dem vollständigen Pfad de/demo/MyClass in der JAR-Datei abgelegt sein muss. Für Testzwecke muss die so erzeugte JAR-Datei gegebenenfalls noch in den CLASSPATH aufgenommen werden.
Anschließend kann die eigentliche Signatur mit jarsigner vorgenommen werden. Dieses Kommando signiert die Datei test.jar mit dem unter dem Alias duke abgelegten Schlüssel:jarsigner test.jar duke
Als letzter Schritt ist noch die Policy entsprechend zu definieren. Wenn das policytool hierzu eingesetzt wird, sind zwei Dinge zu beachten:
- Es muss sichergestellt werden, dass die richtige Keystore-Datei ausgewählt wurde. Diese kann im Menü unter »Bearbeiten¦Keystore ändern« selektiert werden.
- Bei der Pfadangabe zum Keystore sind Backslashes als normale Schrägstriche anzugeben. Die Datei
C:\winnt\profiles\middendorf\.keystoreist folgendermaßen anzugeben:file:/C:/winnt/profiles/middendorf/.keystoreAls Keystore-Typ wird standardmäßig »JKS« für »Java Key Store« angegeben.In der Regel selbst wird der Signierer durch den Alias im Keystore bezeichnet. Abbildung 15.4 zeigt, wie eine Signierer-bezogene Definition im policytool aussieht. Der folgende Ausschnitt aus der Policy-Datei zeigt die dazugehörigen Einträge:
keystore "file:/f:/winnt/profiles/Administrator/.keystore", "JKS"; ... grant signedBy "duke" { permission java.io.FilePermission "<<ALL FILES>>", "write, read"; };