在前一篇文章里提到在生产环境下应该使用SSL来创建JMX连接,本文就来讲一下具体怎么做。
先了解一下Java客户端程序在创建SSL连接的一些相关的事情:
javax.net.ssl.trustStore
指定),那么就会使用$JAVA_HOME/jre/lib/security/cacerts
。如果指定了,就会使用指定的truststore + cacerts来验证。keytool -list -keystore - $JAVA_HOME/jre/lib/security/cacerts
看到(让你输密码的时候直接回车就行了)以上过程被称为server authentication,也就是说client验证server是否可信,server authentication是最常见的,https就是这种模式。
不过在用SSL连接JMX的时候,还要做client authentication,即server验证client是否可信。原理和上面提到的一样,只不过变成server用自己的truststore里验证client的证书是否可信。
上面提到的证书主要保存了一个public key,SSL是一个非对称加密协议,因此还有一个对应的private key,在java里private key和private key存放在keystore里。
下面我们来制作visualvm(client)和java app(server)的keystore和truststore。
先讲大致流程,然后再给出命令:
具体命令:
所以最终得到的文件是这么几个:
我们还是用Tomcat做实验,给CATALINA_OPTS
添加几个参数像下面这样,因为参数比较多,所以我们在$TOMCAT/bin
下添加一个setenv.sh
的文件(记得加上可执行权限):
CATALINA_OPTS="-Dcom.sun.management.jmxremote"
CATALINA_OPTS="$CATALINA_OPTS -Dcom.sun.management.jmxremote.port=1100"
CATALINA_OPTS="$CATALINA_OPTS -Dcom.sun.management.jmxremote.rmi.port=1100"
CATALINA_OPTS="$CATALINA_OPTS -Djava.rmi.server.hostname=<host or ip>"
CATALINA_OPTS="$CATALINA_OPTS -Dcom.sun.management.jmxremote.authenticate=false"
# 以下和启用SSL有关
CATALINA_OPTS="$CATALINA_OPTS -Dcom.sun.management.jmxremote.ssl=true"
CATALINA_OPTS="$CATALINA_OPTS -Dcom.sun.management.jmxremote.registry.ssl=true"
CATALINA_OPTS="$CATALINA_OPTS -Dcom.sun.management.jmxremote.ssl.need.client.auth=true"
CATALINA_OPTS="$CATALINA_OPTS -Djavax.net.ssl.keyStore=<path to java-app.keystore>"
CATALINA_OPTS="$CATALINA_OPTS -Djavax.net.ssl.keyStorePassword=<java-app.keystore的密码>"
CATALINA_OPTS="$CATALINA_OPTS -Djavax.net.ssl.trustStore=<path to java-app.truststore>"
CATALINA_OPTS="$CATALINA_OPTS -Djavax.net.ssl.trustStorePassword=<java-app.truststore的密码>"
然后$TOMCAT/bin/startup.sh
jvisualvm -J-Djavax.net.ssl.keyStore=<path to visualvm.keystore> \
-J-Djavax.net.ssl.keyStorePassword=<visualvm.keystore的密码> \
-J-Djavax.net.ssl.trustStore=<path to visualvm.truststore> \
-J-Djavax.net.ssl.trustStorePassword=<visualvm.truststore的密码>
你可以不加参数启动jvisualvm,看看下一步创建JMX连接是否成功,如果配置正确应该是不会成功的。
加了上述参数启动jvisualvm后,和利用VisualVm和JMX远程监控Java进程里提到的步骤一样创建JMX连接,只不过在创建JMX连接的时候不要勾选【不要求SSL连接】(不过经实测,勾不勾选都能连接成功的)。