原文地址html
在前一篇文章里提到在生产环境下应该使用SSL来建立JMX链接,本文就来说一下具体怎么作。java
先了解一下Java客户端程序在建立SSL链接的一些相关的事情:git
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就是这种模式。github
不过在用SSL链接JMX的时候,还要作client authentication,即server验证client是否可信。原理和上面提到的同样,只不过变成server用本身的truststore里验证client的证书是否可信。segmentfault
上面提到的证书主要保存了一个public key,SSL是一个非对称加密协议,所以还有一个对应的private key,在java里private key和private key存放在keystore里。bash
下面咱们来制做visualvm(client)和java app(server)的keystore和truststore。oracle
先讲大体流程,而后再给出命令:app
具体命令:ide
生成visualvm的keystorepost
keytool -genkeypair \ -alias visualvm \ -keyalg RSA \ -validity 365 \ -storetype pkcs12 \ -keystore visualvm.keystore \ -storepass <visualvm keystore的密码> \ -keypass <同visualvm keystore的密码> \ -dname "CN=<姓名>, OU=<组织下属单位>, O=<组织名称>, L=<城市>, S=<省份>, C=<国家2字母>"
导出visualvm的cert
keytool -exportcert \ -alias visualvm \ -storetype pkcs12 \ -keystore visualvm.keystore \ -file visualvm.cer \ -storepass <visualvm keystore的密码>
把visualvm的cert导入到java-app的truststore里,实际上就是生成了一个truststore
keytool -importcert \ -alias visualvm \ -file visualvm.cer \ -keystore java-app.truststore \ -storepass <java-app truststore的密码> \ -noprompt
生成java-app的keystore
keytool -genkeypair \ -alias java-app \ -keyalg RSA \ -validity 365 \ -storetype pkcs12 \ -keystore java-app.keystore \ -storepass <java-app keystore的密码> \ -keypass <同java-app keystore的密码> \ -dname "CN=<姓名>, OU=<组织下属单位>, O=<组织名称>, L=<城市>, S=<省份>, C=<国家2字母>"
导出java-app的cert
keytool -exportcert \ -alias java-app \ -storetype pkcs12 \ -keystore java-app.keystore \ -file java-app.cer \ -storepass <java-app keystore的密码>
把java-app的cert导入到visualvm的truststore里
keytool -importcert -alias java-app \ -file java-app.cer \ -keystore visualvm.truststore \ -storepass <visualvm truststore的密码> \ -noprompt
因此最终获得的文件是这么几个:
咱们仍是用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链接】(不过经实测,勾不勾选都能链接成功的)。
个人博客即将同步至腾讯云+社区,邀请你们一同入驻:https://cloud.tencent.com/dev...