Signieren? Geht's nicht auch ohne?
Die jenigen, für die eine Signierung der Anwendung nicht in Frage kommt, können sich am Ende dieses Beitrages eine alternative Lösung ansehen.
Unsignierte Applets unterliegen eingeschränkten Rechten in Bezug auf den Zugriff auf Dateien und Resourcen.
So haben sie bspw. keinen Zugriff auf die lokale Datei- und Verzeichnisebene des Clients und dürfen sich nur zu dem Rechner verbinden, von dem sie auch heruntergeladen wurden.
Für Applikationen erlaubte Dinge, wie Ports öffnen, sensible oder persönliche Daten aus dem Client-PC auslesen oder die VM beenden, sind einem unsignierten Applet ebenfalls untersagt.
Ein nicht signiertes Applet wird daher bei einem unerlaubten Zugriff immer eine java.security.AccessControlException werfen.
Signierten Applets werden jedoch erweiterte Rechte auf dem Client zugestanden.
Es gibt zwei Möglichkeiten eine Java-Anwendung zu signieren:
1. Die kostenpflichtige Ausstellung eines Zertifikats von einem darauf spezialisierten Unternehmen, wie z.B. VeriSign (ehem. Thawte), welche die Identität des jenigen, der ein Zertifikat erlangen möchte (Programmierer) bestätigen und ein digitales Zertifikat in Form eines Schlüssels ausstellen.
2. Die Signierung des Programms durch den Programmierer selbst.
Dabei wird mit den Tools des JDK/SDK ein Zertifikat erzeugt.
In beiden Fällen öffnet sich vor dem Start der Anwendung ein Fenster mit einem Sicherheitshinweis, welches sich vom Benutzer die Erlaubnis einholt, eventuell potenziell unsichere/gefährliche Operationen auf seinem System durchführen zu dürfen.
Der Benutzer selbst muss entscheiden, ob er dem Applet vertrauen möchte, oder nicht.
Der Informationsdialog sieht auf einem Windows-System etwa so aus:
Selbsterstelltes Zertifikat|Kostenpflichtiges Zertifikat
Sicherheitshinweis bei einem mit einem selbst erstellten Zertifikat signierten Programm|Sicherheitshinweis bei einem mit einem kostenpflichtigen Zertifikat signierten Programm
Sicherheitshinweis bei einem selbst erstellten Zertifikat unter Ubuntu|Sicherheitshinweis bei mehreren signierten Bibliotheken
Die Informationsdialoge sind in keinem Fall modifizierbar oder unterdrückbar.
Hier kannst du auch ein signiertes Applet testen. Es wird einige System-Informationen aus deinem System lesen und anzeigen, wenn du den Zugriff gestattest.
Zugriffe, die erweiterte Rechte benötigen sind im Applet pink dargestellt.
Hinweis: Oftmals ist aber eine Signierung noch nicht notwendig. Häufig kam es im Forum vor, dass Programmierer in ihren Applets Bilder mit den verkehrten Methoden eingebunden hatten.
Durch Einbinden von Bildern mit den richtigen Methoden wird eine Signierung immer unnötig sein.
Mehr dazu: Grafikdateien laden und anzeigen - Byte-Welt Wiki
Zum Signieren eines Java-Applets muss dieses in einer Jar-Datei gespeichert sein.
Folgende kleine Batchdatei, kann das komfortable Erstellen einer Jar-Datei und anschließende Signieren eines Applets vereinfachen.
Einfach die blauen Texte der Datei mit Hilfe eines Texteditors modifizieren, unter einem Namen wie bspw. SignTool.bat in deinem Projektverzeichnis speichern und per Doppelklick ausführen.
Hinweis: Die Batchdatei darf auf keinen Fall den Namen eines der Tools aus dem JDK erhalten!
Auch wenn Du eine jar-Datei schon erzeugt hast und nur die Signierung mit Hilfe dieser Batchdatei durchführen möchtest, genügt die Modifikation der Batchdatei an den ausgewiesenen Stellen.
Wenn du bisher noch keine Signierung gemacht hast, wirst du im Verlauf des Batchdatei-Ablaufes nach einem Passwort gefragt, welches du selbst wählen kannst. Merke es dir gut. Wenn du es vergisst, kannst du so lange keine weiteren Applets signieren, bis du die .keystore-Datei aus deinem Benutzer-Verzeichnis gelöscht hast.
Damit das nun in einer Jar-Datei verpackte und signierte Applet auch ausgeführt werden kann, muss die HTML-Datei angepasst werden:
Java-Applet in eine Webseite einbinden
Für Webstart-Anwendungen müsste noch die JNLP-Datei angepasst werden, damit sie mit Annahme des Zertifikats (Vertrauenserklärung) alle Rechte des Benutzers auf seinem Rechner erhält:
[XML]<security>
<all-permissions/>
</security>[/XML]
Infos hierzu: JAR File Overview
Die Alternative
Wer nicht signieren möchte, kann das Problem auch mit der JNLP-API angehen.
Hier ein Beispiel, wie man ohne Signieren vom Client lesen und auch auf ihn schreiben kann:
Accessing the Client Using JNLP API (The Java™ Tutorials > Deployment > Doing More With Java Rich Internet Applications)
Weiterführende Links
Die jenigen, für die eine Signierung der Anwendung nicht in Frage kommt, können sich am Ende dieses Beitrages eine alternative Lösung ansehen.
Unsignierte Applets unterliegen eingeschränkten Rechten in Bezug auf den Zugriff auf Dateien und Resourcen.
So haben sie bspw. keinen Zugriff auf die lokale Datei- und Verzeichnisebene des Clients und dürfen sich nur zu dem Rechner verbinden, von dem sie auch heruntergeladen wurden.
Für Applikationen erlaubte Dinge, wie Ports öffnen, sensible oder persönliche Daten aus dem Client-PC auslesen oder die VM beenden, sind einem unsignierten Applet ebenfalls untersagt.
Ein nicht signiertes Applet wird daher bei einem unerlaubten Zugriff immer eine java.security.AccessControlException werfen.
Signierten Applets werden jedoch erweiterte Rechte auf dem Client zugestanden.
Es gibt zwei Möglichkeiten eine Java-Anwendung zu signieren:
1. Die kostenpflichtige Ausstellung eines Zertifikats von einem darauf spezialisierten Unternehmen, wie z.B. VeriSign (ehem. Thawte), welche die Identität des jenigen, der ein Zertifikat erlangen möchte (Programmierer) bestätigen und ein digitales Zertifikat in Form eines Schlüssels ausstellen.
2. Die Signierung des Programms durch den Programmierer selbst.
Dabei wird mit den Tools des JDK/SDK ein Zertifikat erzeugt.
In beiden Fällen öffnet sich vor dem Start der Anwendung ein Fenster mit einem Sicherheitshinweis, welches sich vom Benutzer die Erlaubnis einholt, eventuell potenziell unsichere/gefährliche Operationen auf seinem System durchführen zu dürfen.
Der Benutzer selbst muss entscheiden, ob er dem Applet vertrauen möchte, oder nicht.
Der Informationsdialog sieht auf einem Windows-System etwa so aus:
Selbsterstelltes Zertifikat|Kostenpflichtiges Zertifikat
Sicherheitshinweis bei einem mit einem selbst erstellten Zertifikat signierten Programm|Sicherheitshinweis bei einem mit einem kostenpflichtigen Zertifikat signierten Programm
Sicherheitshinweis bei einem selbst erstellten Zertifikat unter Ubuntu|Sicherheitshinweis bei mehreren signierten Bibliotheken
Die Informationsdialoge sind in keinem Fall modifizierbar oder unterdrückbar.
Hier kannst du auch ein signiertes Applet testen. Es wird einige System-Informationen aus deinem System lesen und anzeigen, wenn du den Zugriff gestattest.
Zugriffe, die erweiterte Rechte benötigen sind im Applet pink dargestellt.
Hinweis: Oftmals ist aber eine Signierung noch nicht notwendig. Häufig kam es im Forum vor, dass Programmierer in ihren Applets Bilder mit den verkehrten Methoden eingebunden hatten.
Durch Einbinden von Bildern mit den richtigen Methoden wird eine Signierung immer unnötig sein.
Mehr dazu: Grafikdateien laden und anzeigen - Byte-Welt Wiki
Zum Signieren eines Java-Applets muss dieses in einer Jar-Datei gespeichert sein.
Folgende kleine Batchdatei, kann das komfortable Erstellen einer Jar-Datei und anschließende Signieren eines Applets vereinfachen.
Einfach die blauen Texte der Datei mit Hilfe eines Texteditors modifizieren, unter einem Namen wie bspw. SignTool.bat in deinem Projektverzeichnis speichern und per Doppelklick ausführen.
Hinweis: Die Batchdatei darf auf keinen Fall den Namen eines der Tools aus dem JDK erhalten!
In deinem Projekt-Verzeichnis sollte vorzugsweise noch keine jar-Datei angelegt sein, das Tool wird dann auch eine korrekte jar-Datei aus deinen .class-Dateien erzeugen können.SignTool.bat hat gesagt.:@echo off
rem * SignTool by L-ectron-X ( java-forum.org )
rem *
rem * Ablauf beim Signieren
rem *
rem * Erzeugen eines eigenen Schlüssels
rem * Mit KeyTool, einem Werkzeug aus dem SDK, einen neuen Schlüssel erzeugen:
rem * keytool -genkey -alias Signer -dname "cn=Dein Name, c=de"
rem * Gib anschließend Dein Passwort ein.
rem *
rem * Erzeugen eines Zertifikats
rem *
rem * Mit KeyTool Zertifikat erzeugen:
rem * keytool -selfcert -alias Signer -dname "cn=Dein Name, c=de"
rem * Gib anschließend dein Passwort ein.
rem * keytool unterstützt weitere Angaben:
rem * CN=commonName
rem * OU=organizationUnit
rem * O=organizationName
rem * L=localityName
rem * S=stateName
rem * C=country
rem *
rem * Signieren des Applets
rem * Signieren des Applets mit Hilfe des Tools jarsigner
rem * jarsigner signed.jar Signer
rem * Und noch einmal dein Passwort eingeben.
echo = SignTool =
echo Dieses Tool hilft beim Erzeugen von signierten jar-Dateien
echo.
echo Schritt 1: jar-Dateien erzeugen
echo -------------------------------
rem Pfad zum SDK setzen
rem --> optional, (auskommentieren, wenn eine Umgebungsvariable gesetzt wurde)
set java_home=.;C:\Programme\Java\jdk1.7.0_09\bin
set path=.;%path%;%java_home%
echo Manifestdatei erzeugen...
echo Manifest-Version: 1.0>manifest.mf
echo Created-by: SignTool by L-ectron-X - java-forum.org>>manifest.mf
rem --> Anpassen, wenn eine Applikation statt eines Applets signiert werden soll!
rem echo Main-Class: package.MainClass>>manifest.mf
echo.>>manifest.mf
if exist *.jar goto key
echo jar-Datei mit angegebenen Parametern erzeugen...
rem --> anpassen!
rem * In folgendem Beispiel werden alle .class-Dateien und die Verzeichnisse bilder und etc
rem * mit ins jar-Archiv gepackt.
jar cfmv MeinJar.jar manifest.mf *.class bilder etc
:key
echo.
echo Schritt 2: Schluessel generieren
echo --------------------------------
rem --> anpassen!
keytool -genkey -alias Signer -dname "cn=Dein Name, c=de"
echo.
echo Schritt 3: Zertifikat erzeugen
echo ------------------------------
rem --> anpassen!
rem -validity 18250 (365 Tage x 50) erzeugt ein 50 Jahre gültiges Zertifikat
keytool -selfcert -validity 3650 -alias Signer -dname "cn=Dein Name, c=de"
if not exist *.jar goto error
echo.
echo Schritt 4: jar-Datei signieren
echo ------------------------------
echo jarsigner erwartet hier nochmals dein Passwort.
rem --> anpassen!
jarsigner MeinJar.jar Signer
echo.
echo Schritt 5: Zertifikat testen
echo ----------------------------
rem --> anpassen!
jarsigner -verify -verbose -certs MeinJar.jar
goto end
:error
echo.
echo Es wurde keine jar-Datei zum Signieren gefunden.
echo Die Erzeugung der jar-Datei ist moeglicherweise fehlgeschlagen.
echo Pruefe deine Eingaben in der Batchdatei!
:end
if not exist manifest.mf goto console
echo.
rem Manifest von Festplatte löschen
del manifest.mf
:console
rem Console für Ausgaben noch geöffnet lassen
echo.
pause
Auch wenn Du eine jar-Datei schon erzeugt hast und nur die Signierung mit Hilfe dieser Batchdatei durchführen möchtest, genügt die Modifikation der Batchdatei an den ausgewiesenen Stellen.
Wenn du bisher noch keine Signierung gemacht hast, wirst du im Verlauf des Batchdatei-Ablaufes nach einem Passwort gefragt, welches du selbst wählen kannst. Merke es dir gut. Wenn du es vergisst, kannst du so lange keine weiteren Applets signieren, bis du die .keystore-Datei aus deinem Benutzer-Verzeichnis gelöscht hast.
Damit das nun in einer Jar-Datei verpackte und signierte Applet auch ausgeführt werden kann, muss die HTML-Datei angepasst werden:
Java-Applet in eine Webseite einbinden
Für Webstart-Anwendungen müsste noch die JNLP-Datei angepasst werden, damit sie mit Annahme des Zertifikats (Vertrauenserklärung) alle Rechte des Benutzers auf seinem Rechner erhält:
[XML]<security>
<all-permissions/>
</security>[/XML]
Infos hierzu: JAR File Overview
Die Alternative
Wer nicht signieren möchte, kann das Problem auch mit der JNLP-API angehen.
Hier ein Beispiel, wie man ohne Signieren vom Client lesen und auch auf ihn schreiben kann:
Accessing the Client Using JNLP API (The Java™ Tutorials > Deployment > Doing More With Java Rich Internet Applications)
Weiterführende Links
- Understanding Signing and Verification (The Java™ Tutorials > Deployment > Packaging Programs in JAR Files)
- keytool-Key and Certificate Management Tool
- jarsigner-JAR Signing and Verification Tool
- Accessing the Client Using JNLP API (The Java™ Tutorials > Deployment > Doing More With Java Rich Internet Applications)
- JNLP File Syntax
Zuletzt bearbeitet von einem Moderator: