从进程列表中隐藏密钥库密码

hiding keystore password from process list

我有一个 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:

You can set out-of-the-box monitoring and management properties in a configuration file or on the command line. Properties specified on the command line override properties in a configuration file. The default location for the configuration file is JRE_HOME/lib/management/management.properties. The Java VM reads this file if either of the command-line properties com.sun.management.jmxremote or com.sun.management.jmxremote.port are set.

本文档适用于 Java 1.8,但我想这同样适用于 Java 1.7。如果没有,我想你必须按照你的建议进行切换。