我有一个Linux服务器和一个java应用程序。我正在使用Java 1.7来运行此应用程序。我想启用JMX进行监控。应通过SSL保护JMX连接。到目前为止很容易。
我的问题:如何以安全的方式告诉jvm密钥库密码?到目前为止,仅当我通过命令行参数" -Djavax.net.ssl.keyStorePassword = mypwd"传递密码时,ssl连接才有效。似乎必须在初始化jvm时设置密码。
如果我在控制台上查看进程列表(ps -ef),我可以看到我的java进程 - 但是包含所有命令行参数。因此,我的密钥库密码以纯文本形式列出,可供列出活动进程的所有人(例如通过snmp代理)。如何隐藏进程列表中的密码?
我曾尝试使用配置文件(com.sun.management.config.file)。它适用于所有jmx特定参数。但我的密码被忽略了。
以纯文本形式在命令行参数中提供密码是唯一的方法吗?
是的 - 我知道Java 1.7已停止服务。如果Java 1.8实际修复了这个问题,我会立即改变。
感谢您的帮助!
答案 0 :(得分:1)
如果您在之前执行System.setProperty("javax.net.ssl.keyStorePassword", "mypwd")
,则可以使用程序中的任何SSL功能。这意味着您应该尽可能在main
被调用之后尽早设置它。您可以根据需要加载自己的属性文件(只能由运行JVM的用户读取),密码可以存储在其中。
<强>更新强>
管理所需的系统属性也可以在配置文件中设置。来自Monitoring and Management Using JMX Technology:
您可以在a中设置开箱即用的监控和管理属性 配置文件或在命令行上。在上面指定的属性 命令行覆盖配置文件中的属性。默认 配置文件的位置是 JRE_HOME
/lib/management/management.properties
。 Java VM读取此内容 file是否为命令行属性之一com.sun.management.jmxremote
或com.sun.management.jmxremote.port
是。textureFromNode:
集。
本文档适用于Java 1.8,但我想同样适用于Java 1.7。如果没有,我猜你必须按照你的建议进行切换。