Webstart + externe Plugins/JARS

benhaze

Mitglied Platinum
Hallo liebe Freunde der Entwicklung!

Ich habe folgendes Problem:

Ich möchte meine Webstart-Anwendung so erweitern, das es möglich ist lokale JARs als Plugin einzubinden.

Das Ganze mache mit dem dem URLClassLoader.
Klappt als Standalone-App (also NICHT via Webstart) auch problemslos.

Als Webstart-App allerdings bekomme ich eine *access denied exception*, sobald das lokale JAR irgendwelche Security-Relevanten Dinge tut (z.B Systemvariablen auslesen).

Die liegt mit Sicherheit am Security-Context und der JNLP-Datei.
Die JNLP-Datzei kennt das Plugin/JAR nicht und dementsprechend hat:
Code:
    <security>
        <all-permissions/>
    </security>
keine Wirkung bei dieser JAR.

Kennt jemand eine Möglichkeit, wie ich dieses lokale JAR dem SecurtiyManager-Context hinzufügen kann?

Ich dachte da an etwas wie:
Code:
com.sun.javaws.security.AppPolicy.getInstance().addPermissions()
oder
Code:
JNLPClassLoaderUtil.getInstance().addResource

Aber leider hatte ich bisher keinen Erfolg, da das Interface (für mich) nicht genügend dokumentiert ist.
Die AccessDenied exception bleibt.
 
Nein ... so kompliziert musst du das garnicht machen.
Der viel einfachere Weg ist mit Hilfe des keytool dir ein Zertifikat zu erstellen und alle JAR-Files die du verwenden möchtest mit diesem Zertifikat zu signieren. Um die Funktion zu gewährleisten reicht ein selbstsigniertes Zertifikat ... du musst dafür also kein Geld ausgeben ... nur bekommts du dann halt die Meldung das das Zertifikat nicht durch eine legitime CA bestätigt wurde ... das ist aber zu vernachlässigen.
Ob man jetzt im JNLP noch Einstellungen bezüglich des Zertifikates machen muss weis ich nicht ...
Ich weis nur das der Grund für diese SecurityException ist der Hintergrund das eine WebStart Anwendung erstmal mit den normalen Sicherheitseinschränkungen wie ein Applet läuft und diese nur durch Signierung gelöst werden können. Ohne Zertifikat kannst du im JNLP einstellen was du willst ... du wirst immer mit dem eingeschränkten SecurityManager arbeiten ...

Ich hoffe das hilft so weit erstmal ...
 
Danke für deine Anteilnahme.

Das Jar habe ich auch versuchseweise signiert.
Allerdings ohne Erfolg. (gleiche AccessDenied Exception)

Der einzige Unterschied ist, das ist beim Laden des JARS ein Dialog aufpoppt. (Die Applikation enthält unsignierten und signierten Code, trotzdem ausführen?)

In einem anderen Forum (weiss nicht mehr wo genau), habe ich gelesen das auch überprüft wird ob das JAR in der JNLP-Datei eingetragen wurde unter
Code:
<RESOURCES>
.

Damit auch:
Code:
    <security>
        <all-permissions/>
    </security>
greift.

Das ist ja leider nicht der Fall bei mir.
In der JNLP ist das Plugin(JAR) nicht bekannt.

Ich denke nicht, das es etwas mit dem Signieren an sich zu tun hat
Es hat mehr was mit dem Security-Context zu tun.
Das JAR hat wohl keine Berechtigung, weil es nicht in der JNLP unter <CODE><RESOURCES></CODE> steht?
 
Zuletzt bearbeitet:
In der AppPolicy.java habe ich folgendes gefunden:

Java:
// Get LaunchDesc for for the JARDesc.
        LaunchDesc ld = null; 
        int access = LaunchDesc.SANDBOX_SECURITY; 
    boolean trusted = false;
        // jd will not have parent if it was not in jnlp file 
        if (jd.getParent() != null) { 
            ld = jd.getParent().getParent(); 
            access = ld.getSecurityModel();         
        }

Es sieht so aus, wenn eine JAR nicht in der JNLP steht, bekommt diese nur SANDBOX-SECURTIY.
Meine Frage nun: Wie kann ich das ändern?
 
Hmm ...
Also die Meldung das deine Anwendung sowohl signierten als auch unsignierten Content enthält ist auf jeden Fall schon mal ein Anzeichen das es daran liegen KÖNNTE. Frage natürlich : wie änderst du das und bringt es was wenn wirklich alles signiert wird ?
Ich bin der Meinung es gerade hier mal gelesen zu haben das das wohl funktionieren soll. Das Problem wird aber vermutlich sein das du halt versuchst etwas dynamisch zuladen.
Da wirft sich mir gleich noch eine Frage auf : warum möchtest du eigentlich Code laden der so nicht zu deiner Anwendung gehört ? Natürlich verstehe ich den Hintergrund des Plugin-Systems *habe mit sowas ja selbst schon viel gespielt* ... aber Java schiebt hier meiner Ansicht nach schon richtiger Weise einen Riegel vor. Du möchtest ja schließlich nicht das irgendjemand ein "böses" Plugin laden kann ... gegen sowas wäre das also schon mal eine gute Sicherung.

Ich hab leider so gut wie keine Erfahrung mit JNLP und WebStart ... daher war die Idee mit dem Signieren auch leider meine einzigste ... und schade das es nicht funktioniert hat.
 
warum möchtest du eigentlich Code laden der so nicht zu deiner Anwendung gehört
Der Plugin-Code gehört im Prinzip schon zu meiner Anwendung.

Java schiebt hier meiner Ansicht nach schon richtiger Weise einen Riegel vor. Du möchtest ja schließlich nicht das irgendjemand ein "böses" Plugin laden kann
Naja.
1. der code läuft höchstens im Sicherheits-Kontext des angemeldeten OS-Benutzers.
2. ob lokal oder nicht lokal (dynamisch oder nicht)....das hindert ja nicht am bösen Code. (auch nicht wenn er signiert ist)
3. wenn irgendwer ein böses plugin laden möchte, kann irgendwer auch gleich die virus-trojaner.exe auf dem System ausführen.
(anstatt den Umweg über mein Plugin-System zu gehen)

Ich verstehe schon irgendwo die Intention der Sicherheit dahinter.
Allerdings kann ich das böse Plugin auch direkt ins System integrieren ohne es dynamisch nachzuladen. Von daher ist es schon quatsch ob dynamisch oder nicht.

Man einfach muss darauf achten welche Rechte man der Java-Anwendung gibt und welche Rechte der OS-Benutzer hat.
 
Hmm ... dann hab ich gerade erlich gesagt keinen Plan wie du das lösen könntest.
Was mir aber noch eingefallen ist : versuche doch dem URLClassLoader mal einen eigenen SecurityManger mitzugeben *OB und wenn ja WIE das geht ... ich habe KEINE Ahnung =D* ... vielleicht bekommst du so mehr Rechte ...
 
Zurück