Tomcat,从 -D 选项中隐藏 javax.net.ssl.keyStorePassword

Tomcat, hide javax.net.ssl.keyStorePassword from -D options

安装在 Tomcat (9.0.36.B.RELEASE) 上的应用程序使用 SSL(在本例中为 IBM MQ)连接到外部源。因此,我需要为此信任库指定一个信任库和密码。

我把它添加到 setenv.sh 中的 JVM_OPTS:

-Djavax.net.ssl.trustStore=/opt/apps/certs/myapplication.truststore
-Djavax.net.ssl.trustStorePassword=TRUSTSTORE-PASSWORD
-Djavax.net.ssl.keyStore=/opt/apps/certs/myapplication.keystore
-Djavax.net.ssl.keyStorePassword=KEYSTORE-PASSWORD

这方面的经典问题,当我这样做时密码是可见的 ps -ef|grep java(在 RHEL 上运行)。

我看到了一些关于如何执行此操作的建议(例如 Hiding plain text password in JVM startup argumnets. " ps -ef | grep 'javax.net.ssl.keyStorePassword'")。但是这些change/add代码或配置在WAR文件中。

我正在寻找“tomcat”解决方案。有没有办法在 Tomcat 的范围内做到这一点。对 WAR 文件的更改很难实施,因为该应用程序来自供应商。

注意:这不适用于 web.xml 中的连接器配置,因为它只会为传入连接设置 SSL。这里的应用程序正在连接到外部系统(因此从 Tomcat 的角度来看是出站的)。

您可以向 $CATALINA_BASE/conf/catalina.properties 添加其他属性,它们将在 Tomcat 的启动期间获取。正如您肯定知道的那样,系统属性对于 JVM 是全局的,因此无法将此配置仅限于单个应用程序:整个 Tomcat 服务器都会受到影响。

几乎所有 Java 系统属性都可以通过这种方式设置,只有少数例外:

  • catalina.basecatalina.home(显然),
  • Tomcat logging
  • 的配置
  • 在用户代码之前启动的 JMX 和其他工具的配置。

注意:一定要检查VersionLoggerListener(在server.xml中定义)是否没有logProps="true",否则系统的值属性将被记录。默认情况下,仅记录 JVM 参数。