jvisualvm ssl远程连接JVM

news/2025/3/26 13:56:00/
jvisualvm 远程ssl连接

一、没认证的 JMX连接 (不安全)

这种方式,仅限于测试环境,可以这样操作。生产环境为了安全起见,还是要使用带认证的方式连接。

  1. 远程jar包服务 启动时 java -jar [jvm参数] xx.jar添加JVM参数

    java -jar -Xmx512M -Xms256m -Djava.rmi.server.hostname=IP -Dcom.sun.management.jmxremote.port=1232 -Dcom.sun.management.jmxremote.rmi.port=1233 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false    xxl-job-admin-2.4.0.jar 
    

    参数解释:

    -Djava.rmi.server.hostname=IP \ 
    # 开启jvm远程监控端口
    -Dcom.sun.management.jmxremote.port=1232 \
    # 开启jvm远程管理端口,用于执行某些jvm命令
    -Dcom.sun.management.jmxremote.rmi.port=1233 \
    -Dcom.sun.management.jmxremote.ssl=false \
    -Dcom.sun.management.jmxremote.authenticate=false 
    
  2. xxx云 ,安全组策略, 入站规则放开 1232,1233端口

  3. ctrl + R输入 jvisualvm ,然后选择 “文件 –》 添加远程主机 ”

添加远程主机

  1. 右键 - 》 添加 JMX 连接。

添加JMX连接

二、SSL证书认证的JMX连接(安全)

需要提前生成 SSL认证的证书。

1. 进入生成证书的目录,并执行脚本

cd /mydata/xxl_job
# 内容比较多, 就写成一个shell脚本, 将需要参数传入即可 
vim jvisualvm_keyStore.sh# 将下面一段脚本复制拷贝,然后 wq 保存退出。
# 授可执行权限
chmod 755 jvisualvm_keyStore.sh# 脚本提取了参数,支持如下两个命令:##  -h:自定义ip或域名,-p:自定义密码  -d:自定义证书有效期,默认365天
sh jvisualvm_keyStore.sh -h  [HOSTNAME] -p [PASSWORD] -d [TIME_DAY] ## 或者 使用自定义密码生成秘钥
sh jvisualvm_keyStore.sh -p [PASSWORD]   ## 或者 使用自定义域名ip,使用默认密码生成秘钥
sh jvisualvm_keyStore.sh -h [HOSTNAME]   

2. 一键生成密钥脚本:

#!/bin/bash#============================================#
#   下面为生成密钥及相关信息配置,注意修改   #
#============================================#
# 默认变量值# 客户端密钥文件别名
CLIENT_ALIAS=visualvm# 服务端密钥文件别名
SERVICE_ALIAS=visualvm-server# 默认密码 
PASSWORD="study@1024"# 默认域名或ip
HOSTNAME="default_hostname"# 有效天数, 默认设置1年
TIME_DAY=365# 解析参数
while getopts ":h:p:d:" opt; docase ${opt} inh )HOSTNAME=$OPTARG;;p )PASSWORD=$OPTARG;;d )TIME_DAY=$OPTARG;;\?)echo "Invalid option: -$OPTARG" 1>&2echo "USER: sh ${0} -h [HOSTNAME] -p [PASSWORD] -d [TIME_DAY]" 1>&2exit 1;;: )echo "Invalid option: -$OPTARG requires an argument" 1>&2echo "USER: sh ${0} -h [HOSTNAME] -p [PASSWORD] -d [TIME_DAY]" 1>&2exit 1;;esac
done# 使用 shift 命令将处理过的参数移除,确保后面不再跟随任何非法参数
shift $((OPTIND -1))# 如果只输入 -h 参数,则使用默认密码
if [ "$PASSWORD" == "study@1024" ] && [ "$HOSTNAME" != "default_hostname" ]; thenecho "Using default password"
# 如果只输入 -p 参数,则使用默认 hostname
elif [ "$PASSWORD" != "study@1024" ] && [ "$HOSTNAME" == "default_hostname" ]; thenecho "Using default hostname"
# 如果同时输入 -h 和 -p 参数,则使用用户指定的值
elif [ "$PASSWORD" != "study@1024" ] && [ "$HOSTNAME" != "default_hostname" ]; thenecho "Using specified values"
elseecho "Invalid arguments: $@" 1>&2echo "USER: sh ${0} -h [HOSTNAME] -p [PASSWORD] -d [TIME_DAY]" 1>&2echo "OR USER: sh ${0} -h [HOSTNAME]  ,This will use the default password" 1>&2exit 1
fi# 输出变量值
echo "password: $PASSWORD"
echo "hostname: $HOSTNAME"
echo "time day: $TIME_DAY"#============================================#
#          客户端相关密钥          #
#============================================## client keystore
keytool -genkeypair -alias $CLIENT_ALIAS -keyalg RSA -validity $TIME_DAY -storetype pkcs12 -keystore "$CLIENT_ALIAS.keystore" -storepass $PASSWORD -keypass $PASSWORD -dname "CN=$HOST OU=Alphalion O=dev L=GZ S=GD C=CN"# client cer
keytool -exportcert -alias $CLIENT_ALIAS -storetype pkcs12 -keystore "$CLIENT_ALIAS.keystore" -file "$CLIENT_ALIAS.cer" -storepass $PASSWORD# 这个命令会将客户端的证书导入到服务端的信任库中,以便服务端能够在 SSL/TLS 握手期间验证客户端证书的有效性。
keytool -importcert -alias $CLIENT_ALIAS -file "$CLIENT_ALIAS.cer" -keystore "$SERVICE_ALIAS.truststore" -storepass $PASSWORD -noprompt#============================================#
#          服务端相关密钥          #
#============================================## server keystore(跟第一步格式是一样的)	
keytool -genkeypair -alias $SERVICE_ALIAS -keyalg RSA -validity $TIME_DAY -storetype pkcs12 -keystore "$SERVICE_ALIAS.keystore" -storepass $PASSWORD -keypass $PASSWORD -dname "CN=$HOST OU=Alphalion O=dev L=GZ S=GD C=CN"# server cer (跟第二步格式一样)
keytool -exportcert -alias $SERVICE_ALIAS -storetype pkcs12 -keystore "$SERVICE_ALIAS.keystore" -file "$SERVICE_ALIAS.cer" -storepass $PASSWORD# 这个命令会将服务端的证书导入到客户端的信任库中,以便客户端能够在 SSL/TLS 握手期间验证服务端证书的有效性。
keytool -importcert -alias $SERVICE_ALIAS -file $SERVICE_ALIAS.cer -keystore "$CLIENT_ALIAS.truststore" -storepass $PASSWORD -noprompt#============================================#
#                    移动清理                 #
#============================================#
# 转移目录。服务端的密钥保存在server目录下,客户端的密钥保存在client目录下
mkdir -p visualvm/client visualvm/server
cp $CLIENT_ALIAS.cer $CLIENT_ALIAS.keystore $CLIENT_ALIAS.truststore visualvm/client
cp $SERVICE_ALIAS.cer $SERVICE_ALIAS.keystore $SERVICE_ALIAS.truststore visualvm/server# 删除源文件
rm {$CLIENT_ALIAS,$SERVICE_ALIAS}.cer {$CLIENT_ALIAS,$SERVICE_ALIAS}.keystore {$CLIENT_ALIAS,$SERVICE_ALIAS}.truststore

Tip: 秘钥文件制作是依赖上一步操作的,制作 时要按照顺序执行
指令会生成6个文件

  • 客户端秘钥放到了visualvm/client目录,用来认证访问服务端的。
  • 服务端秘钥放到了visualvm/server目录,用来加密认证的

执行脚本

3. 服务器端运行jar包时,开启ssl连接:

ssl连接指定 visualvm/server目录下的秘钥文件,用来加密认证

jar包启动完整参数:

如果需要在服务器端启动时查看具体的证书验证成功失败与否信息,可以加入"-Djavax.net.debug=all",意思是打印JVM所有详细日志

java -jar -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=1232  -Dcom.sun.management.jmxremote.rmi.port=1233 -Djava.rmi.server.hostname=IP  -Dcom.sun.management.jmxremote.authenticate=false  -Dcom.sun.management.jmxremote.ssl=true  -Dcom.sun.management.jmxremote.registry.ssl=true  -Dcom.sun.management.jmxremote.ssl.need.client.auth=true  -Djavax.net.ssl.keyStore=/mydata/xxl-job/visualvm/server/visualvm-server.keystore  -Djavax.net.ssl.keyStorePassword=study@1024  -Djavax.net.ssl.trustStore=/mydata/xxl-job/visualvm/server/visualvm-server.truststore -Djavax.net.ssl.trustStorePassword=study@1024   xxl-job-admin-2.4.0.jar

参数说明 :

java -jar -Dcom.sun.management.jmxremote \ 
-Dcom.sun.management.jmxremote.port=1232 \
-Dcom.sun.management.jmxremote.rmi.port=1233 \
-Djava.rmi.server.hostname=IP \
-Dcom.sun.management.jmxremote.authenticate=false \
# 开启远程ssl认证
-Dcom.sun.management.jmxremote.ssl=true \
-Dcom.sun.management.jmxremote.registry.ssl=true \
-Dcom.sun.management.jmxremote.ssl.need.client.auth=true \
# 指定服务器秘钥
-Djavax.net.ssl.keyStore=/mydata/xxl-job/visualvm/server/visualvm-server.keystore \
-Djavax.net.ssl.keyStorePassword=study@1024 \
-Djavax.net.ssl.trustStore=/mydata/xxl-job/visualvm/server/visualvm-server.truststore 
-Djavax.net.ssl.trustStorePassword=study@1024  \
xxl-job-admin.jar

4. 客户端远程SSL连接

  1. 拷贝 visualvm/client目录到本地,用来认证访问服务端的。
  2. %JAVA_HOME%/bin 目录下,调出 cmd窗口,输入如下命令:

一般都有配置jdk的环境变量。可以直接 ctrl + R ,输入cmd调出窗口。

输入完命令后,会自动打开 jvisualvm 程序

# -J-D 指定 JVM的运行参数, 开启ssl连接,指定ssl秘钥和秘钥。如果ssl证书没有问题,就会自动连上远程服务器JVM,如果校验失败,相对于执行普通的"jvisualvm"命令,不会有任何错误提示。具体的证书校验失败想打印的话,需要在服务器端启动时加入"-Djavax.net.debug=all"打印JVM所有详细日志jvisualvm -J-Djavax.net.ssl.keyStore="C:/Users/HZL/yk证书/visualvm/client/visualvm.keystore" -J-Djavax.net.ssl.keyStorePassword="study@1024" -J-Djavax.net.ssl.trustStore="C:/Users/HZL/yk证书/visualvm/client/visualvm.truststore" -J-Djavax.net.ssl.trustStorePassword="study@1024"

首次加载 jvisualvm 不会自动ssl连接远程JVM,还需要手动添加。

  1. 选择 “文件-添加远程主机”

远程主机

  1. 选择 “添加JMX连接”

添加JMX连接

如果证书 ssl 秘钥和密码完全正确,则会自动连接上远程JVM

成功

转载

[VisualVM工具的使用] : https://blog.csdn.net/TheLongir/article/details/124629717


http://www.ppmy.cn/news/109894.html

相关文章

一图看懂 tqdm 模块:一个可在循环和命令行中使用的快速、可扩展的进度条,资料整理+笔记(大全)

本文由 大侠(AhcaoZhu)原创,转载请声明。 链接: https://blog.csdn.net/Ahcao2008 一图看懂 tqdm 模块:一个可在循环和命令行中使用的快速、可扩展的进度条,资料整理笔记(大全) 🧊摘要🧊模块图&…

代码随想录算法训练营第三十九天|62.不同路径 63. 不同路径 II

目录 LeeCode 62.不同路径 深度搜索法 动态规划法 数论方法 LeeCode 63. 不同路径 II LeeCode 62.不同路径 62. 不同路径 - 力扣(LeetCode) 深度搜索法 思路:机器人走过的路径可以抽象为一棵二叉树,而叶子节点就是终点…

20230530----重返学习-redux工程化-react-redux-高阶组件

day-081-eighty-one-20230530-redux工程化-react-redux-高阶组件 redux工程化 redux工程化就是模块化开发。 工程化步骤 redux工程化的第一种方式:拆分和合并reducer。 把各个可以状态集群reducer独立放到单个js文件中。使用combineReducers合并拆分出去的reduce…

【Leetcode -746.使用最小花费爬楼梯 -747.至少是其他数字两倍的最大数】

Leetcode Leetcode -746.使用最小花费爬楼梯Leetcode -747.至少是其他数字两倍的最大数 Leetcode -746.使用最小花费爬楼梯 题目:给你一个整数数组 cost ,其中 cost[i] 是从楼梯第 i 个台阶向上爬需要支付的费用。一旦你支付此费用,即可选择…

黑马Redis视频教程实战篇(三)

目录 一、优惠券秒杀 1.1 全局唯一ID 1.2 Redis实现全局唯一ID 1.3 添加优惠卷 1.4 实现秒杀下单 1.5 库存超卖问题分析 1.6 代码实现乐观锁解决超卖问题 1.7 优惠券秒杀-一人一单 1.8 集群环境下的并发问题 二、分布式锁 2.1 基本原理和实现方式对比 2.2 Redis分布…

gradle的例子

以下是一个详细的Gradle示例代码,用于构建和管理Java项目: build.gradle文件: plugins {id java }group com.example version 1.0-SNAPSHOTsourceCompatibility 1.8repositories {mavenCentral() }dependencies {implementation org.apach…

C++ set类成员函数介绍 (set和multiset)

目录 🤔set模板介绍: 🤔特点: 🤔set的成员函数: 😊set构造函数: 🔍代码实例: 🔍运行结果: 😊 set赋值函数&#xf…

Hive窗口函数详细介绍

文章目录 Hive窗口函数概述样本数据表结构表数据 窗口函数窗口聚合函数count()SQL演示 sum()SQL演示 avg()SQL演示 min()SQL演示 max()SQL演示 窗口分析函数first_value() 取开窗第一个值应用场景SQL演示 last_value()取开窗最后一个值应用场景SQL演示 lag(col, n, default_val…