我有一个Linux服务器和一个Java应用程序。我正在使用Java 1.7运行此应用程序。我想启用JMX进行监视。 JMX连接应通过SSL保护。到目前为止很容易。
我的问题:如何以安全的方式告诉jvm密钥库密码?到目前为止,仅当我通过命令行参数“ -Djavax.net.ssl.keyStorePassword = mypwd”传递密码时,ssl连接才有效。看来必须在初始化jvm时设置密码。
如果我在控制台上查看进程列表(ps -ef),则可以看到我的Java进程-但带有所有命令行参数。因此,对于可以列出活动进程(例如通过snmp代理)的每个人,我的密钥库密码均以纯文本列出。如何从进程列表中隐藏密码?
我已尝试使用配置文件(com.sun.management.config.file)。它适用于所有jmx特定参数。但是我的密码被忽略了。
是否真的以纯文本格式在命令行参数中提供密码?
是-我知道Java 1.7不能使用。如果Java 1.8确实解决了此问题,我将立即进行更改。
感谢您的帮助!
如果执行System.setProperty("javax.net.ssl.keyStorePassword", "mypwd")
之前,则在程序中使用任何SSL功能,它应能正常工作。这意味着您应该将其设置为尽早调用main
。如果愿意,可以先加载自己的属性文件(只有运行JVM的用户才能读取),可以在其中存储密码。
更新
管理所需的系统属性也可以在配置文件中设置。从Monitoring and Management Using JMX Technology:
您可以在以下位置设置开箱即用的监视和管理属性:配置文件或在命令行上。在指定的属性命令行覆盖配置文件中的属性。默认值配置文件的位置是JRE_HOME
/lib/management/management.properties
。 Java VM读取此内容命令行属性之一的文件com.sun.management.jmxremote
或com.sun.management.jmxremote.port
是设置。
本文档适用于Java 1.8,但我想Java 1.7同样适用。如果没有,我想您必须按照建议进行切换。
如何在Java程序中设置密码?