VisualVm利用SSL鏈接JMX的方法

原文地址html

前一篇文章裏提到在生產環境下應該使用SSL來建立JMX鏈接,本文就來說一下具體怎麼作。java

前導知識

先了解一下Java客戶端程序在建立SSL鏈接的一些相關的事情:git

  1. Java client程序在作SSL鏈接的時候,會拉取server的證書,利用truststore去驗證這個證書,若是不存在 or 證書過時 or 不是由可信CA簽發,就意味着服務端不被信任,就不能鏈接。
  2. 若是在程序啓動時沒有特別指定使用哪一個truststore(經過System Property javax.net.ssl.trustStore 指定),那麼就會使用$JAVA_HOME/jre/lib/security/cacerts。若是指定了,就會使用指定的truststore + cacerts來驗證。
  3. cacerts存放了JDK信任的CA證書(含有public key),它裏面預先已經存放了已知的權威CA證書。你能夠經過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

第一步:製做keystore和truststore

上面提到的證書主要保存了一個public key,SSL是一個非對稱加密協議,所以還有一個對應的private key,在java裏private key和private key存放在keystore裏。bash

下面咱們來製做visualvm(client)和java app(server)的keystore和truststore。oracle

先講大體流程,而後再給出命令:app

  1. 生成visualvm的keystore,導出cert,把cert導入到java-app的truststore裏
  2. 生成java-app的keystore,導出cert,把cert導入到visualvm的truststore裏

具體命令:ide

  1. 生成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字母>"
  2. 導出visualvm的cert

    keytool -exportcert \
      -alias visualvm \
      -storetype pkcs12 \
      -keystore visualvm.keystore \
      -file visualvm.cer \
      -storepass <visualvm keystore的密碼>
  3. 把visualvm的cert導入到java-app的truststore裏,實際上就是生成了一個truststore

    keytool -importcert \
      -alias visualvm \
      -file visualvm.cer \
      -keystore java-app.truststore \
      -storepass <java-app truststore的密碼> \
      -noprompt
  4. 生成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字母>"
  5. 導出java-app的cert

    keytool -exportcert \
      -alias java-app \
      -storetype pkcs12 \
      -keystore java-app.keystore \
      -file java-app.cer \
      -storepass <java-app keystore的密碼>
  6. 把java-app的cert導入到visualvm的truststore裏

    keytool -importcert 
      -alias java-app \
      -file java-app.cer \
      -keystore visualvm.truststore \
      -storepass <visualvm truststore的密碼> \
      -noprompt

因此最終獲得的文件是這麼幾個:

  1. visualvm.keystore,包含visualvm的public key和private key
  2. visualvm.truststore,包含java-app cert
  3. java-app.keystore,包含java-app的public key和private key
  4. java-app.truststore,包含visualvm cert

第二步:啓動Tomcat

咱們仍是用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

第三步:啓動visualvm

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鏈接是否成功,若是配置正確應該是不會成功的。

第四步:建立JMX鏈接

加了上述參數啓動jvisualvm後,和利用VisualVm和JMX遠程監控Java進程裏提到的步驟同樣建立JMX鏈接,只不過在建立JMX鏈接的時候不要勾選【不要求SSL鏈接】(不過經實測,勾不勾選都能鏈接成功的)。

參考資料

個人博客即將同步至騰訊雲+社區,邀請你們一同入駐:https://cloud.tencent.com/dev...

相關文章
相關標籤/搜索