Java参数指定JVM的Java.Security文件

15

我正在寻找一个Java参数(或者其他不同的方法),允许我指定一个文件作为JVM所使用的java.security文件,而不是使用在JDK中发现的那个(在JRE lib中)。

更具体地说,我正在使用由他人设置并运行两个(或多个)不同JVM的WebLogic服务器。我们遇到了一个问题,即我正在处理的一个JVM需要与另一个JVM当前使用的不同的java.security文件。我希望有一种方法可以让我只需将我的JVM指向一个新的java.security文件,而无需将其指向完全新的JDK(由于空间限制,我们希望避免上传针对每个JVM特定的JDK)。

我意识到服务器的设置并不理想,但完全重新排列现有设置不可行,也不是我能够做到的事情。因此,我希望有人能提出一个创造性的解决方案,允许多个JVM在相同的JDK上运行,但具有不同的安全配置。

我一直在努力寻找解决方案,但似乎我的谷歌搜索不如我所希望的那样强大。希望你们中的其中一个有答案!

非常感谢。

编辑
抱歉,也许我的原始帖子不太清楚,但我感兴趣的是指定java.security文件,这个文件通常被称为Java主安全属性文件,而不是在同一目录中找到的java.policy文件。

我的方案

我将在此发布我的解决方案,供其他可能遇到类似情况的人参考。

由于我似乎找不到要在启动时指定的参数,因此我决定放弃使用java.security属性文件。可以使用Security类(java.security.Security)在代码中设置属性和提供程序(通常在文件中配置)。因此,至少在过渡期间,我计划编写一个类,以在启动后设置我的JVM特定安全配置(实际上覆盖了文件为其他JVM提供的默认配置)。尽管这种解决方案的明显缺点是它不会将此JVM的安全配置外部化,但该解决方案为我提供了一种在不影响运行在相同JDK上的其他JVM的配置的情况下设置JVM特定属性和提供程序的方法。

感谢其他人花费的时间和考虑。谢谢 =)

3个回答

20

查看OpenJDK源代码,你无法更改java.security文件的加载。然而,该文件有一个名为security.overridePropertiesFile的属性, 如果将其设置为true(正如我的当前纯净安装所做的那样),则允许您通过名为java.security.properties的系统属性来加载附加的安全属性文件。还要注意,命令行语法遵循类似策略文件的模式,其中=指定了额外的配置,==指定完整替换配置。


这个问题,詹姆斯你干得好!我今天有机会就试一下,然后告诉大家结果。 - Kai
1
尝试这个解决方案并没有改变结果。JVM似乎没有覆盖或附加到安全文件,而是使用默认的安全文件。 - Kai
这似乎在这篇文章中有所涉及:https://dzone.com/articles/how-override-java-security - bwobbones

7
也许这个帖子上的被接受的答案可以帮助你,基本上它说你需要指定自己的策略文件,最终调用应该像这样:
java -Djava.security.manager -Djava.security.policy=/some/path/my.policy

3
谢谢,Sanjay。这似乎是一个不错的开始,但请纠正我如果我错了:是指定一个.policy文件吗?是否有办法将其应用于.security文件(即主属性文件以配置安全提供程序等)? - Kai
请注意,正确的参数为“-Djava.security.properties”,而不是“-Djava.security.manager”或“-Djava.security.policy”。可以参考“james”和“mannnnerd”的答案来获取正确的参数。在java.security文件的顶部有一个大的注释块,其中包含覆盖该文件的正确参数,同时该文件中的一个子句也控制着是否接受覆盖。 - hbquikcomjamesl
为“-Djava.security.manager”指定一个java.security覆盖文件会导致JVM崩溃(这在Chromebook上非常严重,我有亲身经历)。为“-DJava.security.policy”指定它根本没有任何有用的作用。 - hbquikcomjamesl

6

您可以设置系统属性-Djava.security.properties=*****来指定要加载的安全属性,但在使用此方法之前,必须先设置属性security.overridePropertiesFile=true。


2
不确定早期版本如何,但如果你查看Java 8中java.security文件顶部的注释,一切都很清楚:-Djava.security.properties=<URL>会追加到主安全属性文件。如果两个属性文件都为相同的键指定了值,则选择命令行属性文件的值,因为它是最后加载的一个。此外,如果您指定-Djava.security.properties==<URL>(2个等号),则该属性文件将完全覆盖主安全属性文件。 - mtjhax
4
在排除以这种方式加载覆盖文件时,-Djava.security.debug=properties也可能会变得很有用。 - Janaka Bandara

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接