原文地址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...