2010-12-23 9 views
11

Ich suche nach einem Java-Argument (oder vielleicht einer anderen Methode), um eine Datei angeben zu können, die von der JVM als java.security-Datei verwendet werden soll Verwenden Sie das im JDK (in der JRE-Bibliothek) gefundene.Java-Argument zur Angabe von Java.Security-Datei für JVM

Um Ihnen ein wenig mehr Kontext zu geben, arbeite ich mit einem WebLogic-Server, der von jemand anderem eingerichtet wurde und zwei (oder mehr) verschiedene JVMs vom gleichen JDK aus ausführt. Wir haben jetzt ein Problem, bei dem die Arbeit, die ich an einer JVM mache, eine andere java.security-Datei erfordert als die, die gerade von der anderen JVM verwendet wird. Ich hoffe, dass es für mich eine Möglichkeit gibt, meine JVM auf eine neue java.security-Datei zu verweisen, ohne sie auf ein komplett neues JDK verweisen zu müssen (aus Platzgründen möchten wir kein JDK für jede JVM hochladen)).

Ich bin mir bewusst, dass die Server-Setup ist nicht ideal, aber die komplette Neuanordnung der bestehenden Einrichtung ist nicht praktikabel und nicht etwas, was ich in der Lage bin zu tun. Ich hoffe also, dass jemand eine kreative Lösung hat, mit der mehrere JVMs mit demselben JDK, aber mit unterschiedlichen Sicherheitskonfigurationen ausgeführt werden können.

Ich habe versucht, Lösungen zu finden, aber es scheint, dass mein Google-Foo nicht so stark ist, wie ich gehofft hatte. Hier ist zu hoffen, dass einer von euch die Antwort hat!

Vielen Dank.

EDIT
Leider vielleicht mein ursprünglicher Beitrag war nicht klar, aber ich bin daran interessiert, die java.security Datei anzugeben, auch bezeichnete oft als die Java Master-Sicherheitseigenschaften Datei, nicht die Datei java.policy welches im selben Verzeichnis gefunden wird.

Meine Lösung

Ich werde meine Lösung hier posten nur als Referenz von anderen, die in eine ähnliche Situation geraten könnten.

Da ich beim Start kein Argument finden kann, habe ich beschlossen, auf die Eigenschaftendatei java.security zu verzichten. Mit der Security-Klasse (java.security.Security) können Eigenschaften und Provider (normalerweise in der Datei konfiguriert) innerhalb von Code festgelegt werden. Also, zumindest in der Zwischenzeit, plane ich, eine Klasse zu schreiben, die meine JVM-spezifischen Sicherheitskonfigurationen nach dem Start einrichten wird (im Wesentlichen das Überschreiben der Standardkonfigurationen, die von der Datei für die andere JVM bereitgestellt werden). Während der offensichtliche Nachteil dieser Lösung darin besteht, dass Sicherheitskonfigurationen dieser JVM nicht externalisiert werden, bietet die Lösung mir die Möglichkeit, JVM-spezifische Eigenschaften und Provider festzulegen, ohne die Konfiguration anderer JVMs zu beeinträchtigen, die vom selben JDK ausgeführt werden.

Ich schätze die Zeit und Rücksicht von anderen gegeben. Danke =)

Antwort

6

Vielleicht die angenommene Antwort auf this thread würde Ihnen helfen; im Grunde sagt es, dass Sie Ihre eigene Richtliniendatei und der endgültige Aufruf sollte angeben müssen wie folgt aussehen:

java -Djava.security.manager -Djava.security.policy=/some/path/my.policy 
+3

Vielen Dank, Sanjay. Dies scheint ein guter Ausgangspunkt zu sein, aber korrigieren Sie mich, wenn ich falsch liege, ist eine .policy-Datei anzugeben? Gibt es eine Möglichkeit, dies auf eine .Security-Datei anzuwenden (d. H. Die Master-Eigenschaftendatei, um Sicherheitsanbieter usw. zu konfigurieren)? – Kai

10

Mit Blick auf den OpenJDK source, Sie nicht den Laden der java.security Datei ändern können. Diese Datei hat jedoch eine Eigenschaft mit dem Namen security.overridePropertiesFile, die, wenn sie auf true gesetzt ist (wie in meiner aktuellen Vanilla-Installation), das Laden einer zusätzlichen Sicherheitseigenschaftendatei ermöglicht, die über die Systemeigenschaft java.security.properties angegeben wird.Beachten Sie außerdem, dass die Befehlszeilensyntax einem ähnlichen Muster wie die Richtliniendatei folgt, wobei = eine zusätzliche Konfiguration angibt und == eine vollständige Ersatzkonfiguration angibt.

+0

Weg zur Quelle, James! Ich werde das heute ausprobieren, wenn ich eine Chance bekomme und jeden von den Ergebnissen wissen lassen. – Kai

+1

Der Versuch, diese Lösung zu verwenden, ergab keine Änderung der Ergebnisse. Die JVM scheint die Sicherheitsdatei nicht zu überschreiben oder anzuhängen und verwendet einfach die Standarddatei. – Kai

+0

Dies scheint in diesem Artikel behandelt werden: https://dzone.com/articles/how-override-java-security – bwobbones

3

Sie können einfach die Systemeigenschaft -Djava.security.properties = ***** festlegen, um die Sicherheitseigenschaft anzugeben, die Sie laden möchten. Sie müssen jedoch die Eigenschaft security.overridePropertiesFile = true festlegen, bevor Sie diese Methode verwenden.

+0

Nicht sicher über frühere Versionen, aber wenn Sie auf die Kommentare an der Spitze der java.security-Datei in suchen Java 8, alles ist klar: '-Djava.security.properties = ' hängt an die Master-Eigenschaftendatei. Wenn beide Eigenschaftendateien Werte für den gleichen Schlüssel angeben, wird der Wert aus der Befehlszeileneigenschaftendatei ausgewählt, da der zuletzt geladene Befehl geladen wird. Wenn Sie '-Djava.security.properties == ' (2 equals) angeben, überschreibt diese Eigenschaftendatei die Master-Sicherheitseigenschaftendatei vollständig. – mtjhax