前因,为了修复JMX漏洞,由原TCP方式改为SSL认证方式,过程非常折腾,在此简单记录,希望帮到后面的同学!
第一步,生成证书:
服务端keystore和证书
/root/jdk1.8_LIN_X64/jre/bin/keytool -genkeypair -keystore serverkeystore -alias serverkey -validity 1800 -storepass zs0001 -keypass zs0001
/root/jdk1.8_LIN_X64/jre/bin/keytool -exportcert -keystore serverkeystore -alias serverkey -storepass zs0001 -file server.cer
生成客户端keystore和证书
/root/jdk1.8_LIN_X64/jre/bin/keytool -genkeypair -keystore clientkeystore -alias clientkey -validity 1800 -storepass zs0001 -keypass zs0001
/root/jdk1.8_LIN_X64/jre/bin/keytool -exportcert -keystore clientkeystore -alias clientkey -storepass zs0001 -file client.cer
将客户端证书导入到服务端truststore
/root/jdk1.8_LIN_X64/jre/bin/keytool -importcert -file client.cer -keystore servertruststore -storepass zs0001
将服务端证书导入到客户端truststore
/root/jdk1.8_LIN_X64/jre/bin/keytool -importcert -file server.cer -keystore clienttruststore -storepass zs0001
解释:
-validity 1800 为天数
-storepass, -keypass 为密码
生成key时一路回车,直到最后输入 y 即可。也可根据自己实际情况设置
keytool 需与tomcat应用的java环境版本相同,否则会有异常。
第二步,Tomcat配置JMX服务端
tomcat 的catalina.sh 放在首行,配置JMX服务端。
建议先拿个干净的Tomcat来做验证。
CATALINA_OPTS="$CATALINA_OPTS -Djava.rmi.server.hostname=127.0.0.1 -Dcom.sun.management.jmxremote.port=6443 -Dcom.sun.management.jmxremote.rmi.port=6443 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=true -Dcom.sun.management.jmxremote.ssl.need.client.auth=true -Dcom.sun.management.jmxremote.registry.ssl=true -Djavax.net.ssl.keyStore=/root/software/keys/serverkeystore -Djavax.net.ssl.keyStorePassword=zs00001 -Djavax.net.ssl.trustStore=/root/software/keys/servertruststore -Djavax.net.ssl.trustStorePassword=zs00001"
注意:
1、如果想在外网通过Jconsole测试访问,需要把127.0.0.1改为服务器外可访问的IP,如:192.168.20.170;
2、如果使用的是Windows系统,则需要在catalina.bat中修改,并把上面代码换成:
set CATALINA_OPTS=-Djava.rmi.server.hostname=127.0.0.1 -Dcom.sun.management.jmxremote.port=6443 -Dcom.sun.management.jmxremote.rmi.port=6443 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=true -Dcom.sun.management.jmxremote.ssl.need.client.auth=true -Dcom.sun.management.jmxremote.registry.ssl=true -Djavax.net.ssl.keyStore=C:\Users\serverkeystore -Djavax.net.ssl.keyStorePassword=zs00001 -Djavax.net.ssl.trustStore=C:\Users\servertruststore -Djavax.net.ssl.trustStorePassword=zs00001
第三步,验证JMX服务端
验证方式一:
本地使用Jconsole验证是否配置正常。
把生成的clientkey拷下来,通过cmd输入
jconsole -J-Djavax.net.ssl.keyStore=C:\Users\23228\clientkeystore -J-Djavax.net.ssl.keyStorePassword=zs00001 -J-Djavax.net.ssl.trustStore=C:\Users\23228\clienttruststore -J-Djavax.net.ssl.trustStorePassword=zs00001
打开jconsole窗口后,
在远程进程中输入远程IP及JMX端口,因为已经有KEY,连接成功直接进入监控界面。不会出现什么不安全连接之类的东东。
验证方式二:
通过这篇文的方式验证【JMX Client端SSL+证书Key(JAVA)】
第四步,AMQ配置,按需修改
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:amq="http://activemq.apache.org/schema/core"
xmlns:xsi=