VisualVm利用SSL连接JMX的方法

原文地址

前一篇文章里提到在生产环境下应该使用SSL来创建JMX连接,本文就来讲一下具体怎么做。

前导知识

先了解一下Java客户端程序在创建SSL连接的一些相关的事情:

  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就是这种模式。

不过在用SSL连接JMX的时候,还要做client authentication,即server验证client是否可信。原理和上面提到的一样,只不过变成server用自己的truststore里验证client的证书是否可信。

第一步:制作keystore和truststore

上面提到的证书主要保存了一个public key,SSL是一个非对称加密协议,因此还有一个对应的private key,在java里private key和private key存放在keystore里。

下面我们来制作visualvm(client)和java app(server)的keystore和truststore。

先讲大致流程,然后再给出命令:

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

具体命令:

  1. 生成visualvm的keystore 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连接】(不过经实测,勾不勾选都能连接成功的)。

参考资料

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏乐沙弥的世界

基于CentOS 7配置Nginx自启动

Nginx是广为流行的轻量级Web服务器软件。它开源,短小精悍,简单易用,深受广大互联网企业以及IT运维人员所喜爱。很多时候,我们在生产环境基于编译方式安装Ng...

1253
来自专栏IT进修之路

原 荐 最新SpringCloud 服务注入

3913
来自专栏有困难要上,没有困难创造困难也要上!

Cloud Foundry 运行bosh create-env时报错: TLS handshake timeout

3879
来自专栏颇忒脱的技术博客

利用VisualVm和JMX远程监控K8S里的Java进程

在利用VisualVm和JMX远程监控Java进程和VisualVm利用SSL连接JMX的方法里介绍了如何使用VisualVm+JMX监控远程Java进程的方法...

3121
来自专栏Java技术分享

SSM三大框架整合详细总结(Spring+SpringMVC+MyBatis)

使用 SSM ( Spring 、 SpringMVC 和 Mybatis )已经很久了,项目在技术上已经没有什么难点了,基于现有的技术就可以实现想要的功能,当...

1.3K12
来自专栏李蔚蓬的专栏

基于VM14+ Ubuntu 16.04安装VMware Tools(VM同主机file交互的工具)以及使用的骚操作

在安装VMware Tools时,需要修改指向VMware Tools所在(VMware Workstation\linux.iso),在这个路径下有个l...

1645
来自专栏python百例

111-配置IP地址

RHEL7主机有四块网卡,名为eth0/eth1/eth2/eth3。为四块网卡配置IP地址。

1833
来自专栏运维前线

CentOS 7 配置Java语言开发环境

CentOS 7 配置Java语言开发环境 初始化设置参考:http://blog.csdn.net/wh211212/article/details/529...

2858
来自专栏张善友的专栏

CentOS 安装PostgreSQL 9.1

PostgreSQL通常也简称Postgres,是一个关系型数据库管理系统,适用于各种Linux操作系统、Windows、Solaris、BSD和Mac OS ...

3598
来自专栏Ryan Miao

gradle中使用嵌入式(embedded) tomcat, debug 启动

在gradle项目中使用embedded tomcat。 最开始部署项目需要手动将web项目打成war包,然后手动上传到tomcat的webapp下,然后启动t...

4809

扫码关注云+社区

领取腾讯云代金券