2009-03-03 9 views
4

Ich brauche ein Applet, um einen Socket zu öffnen und mit einem Server zu kommunizieren, der auf den lokalen Host abhört, auf den das Applet heruntergeladen wurde (der Endbenutzer).Können signierte Applets mit einem anderen Host verbunden werden, von dem sie stammen?

im Gegensatz zu dem, was ich über Applet Sicherheit gelesen haben, so scheint es, dass selbst signierte Applets keine Socket an einen anderen Host, von dem sie (auf der gleichen Maschine es funktioniert perfekt) heruntergeladen wurden, öffnen

I zertifiziert das Applet mit -selfcert, signiert es jarsigner verwenden und immer noch, wann immer es eine Buchse auf einen anderen Host zu öffnen versucht, erhalte ich:

Java.lang.Exception: java.security.AccessControlException: access denied (java.net.SocketPermission 127.0.0.1:9999 connect,resolve)

ich habe sogar versucht die Java-Policy-Datei zu ändern, obwohl mit signierte Applets es ist nicht dazu verpflichtet:

grant codeBase "http://applethost:8080/socket" { permission java.security.AllPermission; permission java.lang.RuntimePermission "usePolicy"; };

Was das Abkommen mit sigend Applets ist, können sie connet auf einen anderen Host oder nicht?

Antwort

1

Ja, wenn Sie Ihr Applet laden, wenn Sie das Zertifikat akzeptieren und ihm vertrauen, wird AllPermission gewährt, einschließlich SocketPermission. Ich habe ein signiertes Applet geschrieben, das eine Verbindung zu einem anderen Host herstellt als dem, von dem es geladen wurde. Sie könnten versuchen, vorübergehend Ihre Java-Policy-Datei zu ändern nur

grant { 
    permission java.security.AllPermission; 
}; 
  • Schauen Sie in Ihrer Richtliniendatei haben, um zu sehen, ob es irgendwelche anderen policy.url Standorte definiert, vielleicht stören sie.
  • Überprüfen Sie Ihre Browsereinstellungen für Javascript vielleicht.
  • Stellen Sie sicher, dass Sie das Zertifikat für das Applet akzeptiert haben und es in Ihrer Liste der Site-Zertifikate installiert wird.
  • Stellen Sie sicher, dass die Grant-CodeBase-Zeile die gleiche ist wie die Codebase in Ihrem Applet-Manifest.
  • Sie könnten versuchen, die Liste der Berechtigungen auszudrucken, die Ihr Applet hat, bevor Sie die Verbindung versuchen.
  • Sie könnten versuchen, AllPermission programmatisch innerhalb des Applets zu gewähren.
+0

@John, es scheint, dass gerade Erteilung von Erlaubnis java.security.AllPermission; funktioniert, aber das ist immer noch der einzige Weg, um es zum Laufen zu bringen. Ich habe das Applet seine codeBase drucken lassen und es scheint in Ordnung zu sein. Sehr frustrierend, aber zumindest dank dir weiß ich, dass es in der Tat sicherheitsrelevant ist und nicht irgendein seltsames Problem. – adilei

+0

@John, ich werde diese Antwort akzeptieren, da es wahr ist - es ist möglich, dass ein Applet einen Socket zu einem anderen Host öffnet. Ich werde jedoch eine Follow-up-Frage aufstellen, wenn Sie interessiert sind, mir dort zu folgen. Prost, Adi. – adilei

+0

Wie können Sie "AllPermission" programmatisch gewähren? Was ist der Sinn eines Sicherheits-Managers, um die Ausführung von bösartigem Code zu verhindern, wenn der Code sich selbst die Erlaubnis geben kann, das zu tun, was er will? Es ist sogar möglich, es sollte nicht sein !. @ John, wenn Sie dies lesen, können Sie bitte das letzte Geschoss löschen, um zu verhindern, dass andere Leute den falschen Weg gehen, indem Sie versuchen, etwas zu implementieren, was der Java-Standard explizit verhindert. Entweder das oder erklären, warum ich falsch liege. Vielen Dank! –