Applet java.security.AccessControlException trotz signierten Jar

Ctwx

Mitglied
Morgen,

ich habe ein kleinen Server/Client mithilfe ein paar Tutorials geschrieben. Diese beiden Programme funktionieren auch, sofern ich sie nur über die Konsole starte.
Nun wollte ich den Client als Applet umschreiben, also als eine Art Server Status Tool. Dazu verwende ich Socket, was aber zu einigen Problemen geführt hat.
Als ich mich dann erkundigt hatte was denn das Problem war, habe ich nach Signieranleitungen gesucht und bin auf http://www.java-forum.org/applets/16717-applets-webstart-anwendungen-signieren.html gestoßen.
Da ich unter Linux bin, kann ich die bat-Datei nicht einfach ausführen. Ich habe aber einfach alle Befehle per Hand ausgeführt.

Zu aller erst einmal den Quellcode des Applets:
Java:
import java.awt.Graphics;
import java.applet.Applet;
import java.io.*;
import java.net.*;

public class OnlineStatusApplet extends Applet
{
	private String statusText;
	private boolean serverStatus;

	public void init()
	{
		Socket socket = null;
		BufferedReader in = null;
		PrintWriter out = null;
		serverStatus = false;
		
		try {
                                          // Ich habe die echte IP gegen "localhost" ersetzt!
			socket = new Socket("localhost", 4442);
			in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
			out = new PrintWriter(socket.getOutputStream());
		} catch(UnknownHostException e) {
			System.err.println("Don't know about host");
			//System.exit(1);
		} catch(IOException e) {
			System.err.println("Couldn't connect");
			//System.exit(1);
		}
		
		out.println("Hello, are you there?");
		
		try {
			while(in.readLine() != null) {
				System.out.println("Server's online!");
				serverStatus = true;
			}

			in.close();
			socket.close();
		} catch(IOException e) {
			System.err.println(e.toString());
			serverStatus = false;
			//System.exit(1);
		}
	}
	
	public void paint(Graphics gc)
	{
		if(serverStatus == true) {
			statusText = new String("Der Server ist online!");
		} else {
			statusText = new String("Der Server ist offline!");
		}
		
		gc.drawString(statusText, 5, 15);
	}
}


Das Jar-Archive ist aber signiert:
Code:
$ jarsigner -verify -verbose -certs osa.jar 

         148 Sun May 29 23:15:58 CEST 2011 META-INF/MANIFEST.MF
         269 Sun May 29 23:15:58 CEST 2011 META-INF/SIGNER.SF
         843 Sun May 29 23:15:58 CEST 2011 META-INF/SIGNER.DSA
           0 Sun May 29 23:15:26 CEST 2011 META-INF/
smk     1785 Sun May 29 23:15:12 CEST 2011 OnlineStatusApplet.class

      X.509, CN=Christian Wansart, C=de (signer)
      [certificate is valid from 29.05.11 22:43 to 26.05.21 22:43]


  s = signature was verified 
  m = entry is listed in manifest
  k = at least one certificate was found in keystore
  i = at least one certificate was found in identity scope

jar verified.


Und der appletviewer gibt mir diese Ausgabe:
Code:
java.security.AccessControlException: access denied (java.net.SocketPermission ***IP-Adresse***:4442 connect,resolve)
        at java.security.AccessControlContext.checkPermission(AccessControlContext.java:374)
        at java.security.AccessController.checkPermission(AccessController.java:546)
        at java.lang.SecurityManager.checkPermission(SecurityManager.java:532)
        at java.lang.SecurityManager.checkConnect(SecurityManager.java:1034)
        at java.net.Socket.connect(Socket.java:524)
        at java.net.Socket.connect(Socket.java:478)
        at java.net.Socket.<init>(Socket.java:375)
        at java.net.Socket.<init>(Socket.java:189)
        at OnlineStatusApplet.init(OnlineStatusApplet.java:19)
        at sun.applet.AppletPanel.run(AppletPanel.java:424)
        at java.lang.Thread.run(Thread.java:662)


Ich habe im Quelltext die echte IP-Adresse gegen localhost ausgetauscht und in der appletviewer Ausgabe gegen ***IP-Adresse*** ersetzt. Es handelt sich dabei aber um eine statische IP-Adresse, die ich aus Sicherheitsgründen nicht unbedingt öffentlich machen will. 🙂


Ich hatte dann nach "java.security.AccessControlException: access denied (java.net.SocketPermission" gesucht, aber leider nur Anleitungen für ein policy-File gefunden. Ich finde aber, dass die Lösung nicht sehr schön ist, wenn ich dem Benutzer, der eigentlich gar keine Ahnung von so etwas hat, erklären muss, wie er ein policy-File erstellt.
Außerdem dachte ich, dass ich es umgehen kann, da in L-ectron-Xs Anleitung steht:
Ein nicht signiertes Applet wird daher bei einem unerlaubten Zugriff immer eine java.security.AccessControlException werfen.


Irgendwelche Ideen? Ich kann mir eigentlich nicht vorstellen, dass ich der erste bin dem so etwas passiert, aber ich konnte bisher noch nichts finden, was dem entspricht. Also entschuldigt bitte, wenn ich hier einen Thread geöffnet habe, der wohlmöglich schon in ähnlicherweise existiert.



Danke
 
Vielleicht muss man beim Appletviewer nochmal speziell was einstellen oder so, da weiß jemand anderes spontan das, was ich mir da erst ergooglen würde, aber... hast du das schonmal in einem Brwoser probiert? DER fragt dann nämlich nochmal mit einem Dialog nach: "Achtung, gefährlich, darf das Applet das? {Ja}{Nein}". (Ich weiß nicht, ob der Appletviewer auch so einen Dialog anzeigen könnte oder sollte...?)
 
OK, dann steht auf der "Java Console" (im Firefox unter "Extras") vermutlich die Exception? Hast du den Browsercache- und Applet-Cache gelöscht ('x' in der Java Console), damit nicht noch eine alte, vielleicht unsignierte Version irgendwo rumliegt? Spontan weiß ich sonst auch nicht, woran das noch liegen könnte... Vielleicht hat L-ectron-X (oder jemand anderes) noch eine Idee...
 
Zeig mal bitte dein komplettes Applet-Tag, vielleicht gibts da noch einen Fehler drin.
Außerdem kann die aktuelle Fehlermeldung aus der Java-Konsole weiter helfen.
 
Danke für eure Antworten.

Hier den HTML-Code mit dem ich das Applet einbinde:
HTML:
<applet code="OnlineStatusApplet.class" archive="osa.jar" width="200" height="35" alt="">
</applet>

Ich konnte ironischerweise weder im Opera noch im Firefox die Java Console finden. Also habe ich sie per Hand mit "ControlPanel" angeschaltet. Jedoch schließt sich die Java Konsole einen kurzen Moment, nach dem ich auf der HTML-Seite bin, auf den mein Applet ist.
Loggt die Java Konsole vielleicht irgendwo?


Danke
 
Ich habe zurzeit openSUSE Linux 11.4 drauf. Java Version ist:
Code:
java version "1.6.0_25"
Java(TM) SE Runtime Environment (build 1.6.0_25-b06)
Java HotSpot(TM) Client VM (build 20.0-b11, mixed mode)

--------------------------------

edit1:
Ich habe gerade einmal die Klasse ein wenig gekürzt, in einer jar-gepackt, mit dem gleichen Schlüssel signiert und eingefügt. Jetzt bleibt die Java Konsole auch offen .. und wirft eine Exception, dass es nicht verbinden konnte. Ist weiter aber nicht schlimm und verwunderlich, da mein PC (bin am Notebook) mit dem Server-Tool nicht läuft.
Ich versuche mal die Zeile zu lokalisieren, die das Problem verursacht.

Hier der funktionierende Quellcode:
Java:
import java.awt.Graphics;
import java.applet.Applet;
import java.io.*;
import java.net.*;

public class OnlineStatusApplet extends Applet
{
	private String statusText;

	public void init()
	{
		Socket socket = null;
		
		try {
			socket = new Socket("**.**.**.**", 4442); // IP entfernt...
		} catch(UnknownHostException e) {
			System.err.println("Don't know about host");
			//System.exit(1);
		} catch(IOException e) {
			System.err.println("Couldn't connect");
			//System.exit(1);
		}
		
		statusText = new String("Hello World!");
	}
	
	public void paint(Graphics gc)
	{		
		gc.drawString(statusText, 5, 15);
	}
}
 
Zuletzt bearbeitet:

Neue Themen


Zurück
Oben