jvisualvm ssl远程连接JVM

2023-11-02

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; do
  case ${opt} in
    h )
      HOSTNAME=$OPTARG
      ;;
    p )
      PASSWORD=$OPTARG
      ;;
    d )
      TIME_DAY=$OPTARG
      ;;
    \?)
      echo "Invalid option: -$OPTARG" 1>&2
      echo "USER: sh ${0} -h [HOSTNAME] -p [PASSWORD] -d [TIME_DAY]" 1>&2
      exit 1
      ;;
    : )
      echo "Invalid option: -$OPTARG requires an argument" 1>&2
      echo "USER: sh ${0} -h [HOSTNAME] -p [PASSWORD] -d [TIME_DAY]" 1>&2
      exit 1
      ;;
  esac
done

# 使用 shift 命令将处理过的参数移除,确保后面不再跟随任何非法参数
shift $((OPTIND -1))

# 如果只输入 -h 参数,则使用默认密码
if [ "$PASSWORD" == "study@1024" ] && [ "$HOSTNAME" != "default_hostname" ]; then
  echo "Using default password"
# 如果只输入 -p 参数,则使用默认 hostname
elif [ "$PASSWORD" != "study@1024" ] && [ "$HOSTNAME" == "default_hostname" ]; then
  echo "Using default hostname"
# 如果同时输入 -h 和 -p 参数,则使用用户指定的值
elif [ "$PASSWORD" != "study@1024" ] && [ "$HOSTNAME" != "default_hostname" ]; then
  echo "Using specified values"
else
  echo "Invalid arguments: $@" 1>&2
  echo "USER: sh ${0} -h [HOSTNAME] -p [PASSWORD] -d [TIME_DAY]" 1>&2
  echo "OR USER: sh ${0} -h [HOSTNAME]  ,This will use the default password" 1>&2
  exit 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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

jvisualvm ssl远程连接JVM 的相关文章

  • AES 加密 Java/plsql

    我需要在Java和plsql DBMS CRYPTO for Oracle 10g 上实现相同的加密 解密应用程序 两种实现都工作正常 但这里的问题是我对相同纯文本的加密得到了不同的输出 下面是用于加密 解密过程的代码 Java 和 PLS
  • Java程序中的数组奇怪的行为[重复]

    这个问题在这里已经有答案了 我遇到了这个 Java 程序及其以意想不到的方式运行 以下程序计算 int 数组中元素对之间的差异 import java util public class SetTest public static void
  • JNI 不满意链接错误

    我想创建一个简单的 JNI 层 我使用Visual studio 2008创建了一个dll Win 32控制台应用程序项目类型 带有DLL作为选项 当我调用本机方法时 出现此异常 Exception occurred during even
  • CXF Swagger2功能添加安全定义

    我想使用 org apache cxf jaxrs swagger Swagger2Feature 将安全定义添加到我的其余服务中 但是我看不到任何相关方法或任何有关如何执行此操作的资源 下面是我想使用 swagger2feature 生成
  • 当分配给变量时,我可以以某种方式重用 Gremlin GraphTraversals 代码吗?

    我有看起来像这样的 GraphTraversals attrGroup GraphTraversal
  • jdbc4.MySQLSyntaxErrorException:数据库中不存在表

    我正在使用 SpringBoot 开发一个网络应用程序 这是我的application properties文件来指定访问数据库的凭据 spring datasource driverClassName com mysql jdbc Dri
  • 使用替换字符串中多个单词的最有效方法[重复]

    这个问题在这里已经有答案了 此刻我正在做 Example line replaceAll replaceAll cat dog replaceAll football rugby 我觉得那很丑 不确定有更好的方法吗 也许循环遍历哈希图 ED
  • Prim 的迷宫生成算法:获取相邻单元格

    我基于 Prim 算法编写了一个迷宫生成器程序 该算法是 Prim 算法的随机版本 从充满墙壁的网格开始 选择一个单元格 将其标记为迷宫的一部分 将单元格的墙壁添加到墙壁列表中 While there are walls in the li
  • 无法理解 Java 地图条目集

    我正在看一个 java 刽子手游戏 https github com leleah EvilHangman blob master EvilHangman java https github com leleah EvilHangman b
  • 迁移到 java 17 后有关“每个进程的内存映射”和 JVM 崩溃的 GC 警告

    我们正在将 java 8 应用程序迁移到 java 17 并将 GC 从G1GC to ZGC 我们的应用程序作为容器运行 这两个基础映像之间的唯一区别是 java 的版本 例如对于 java 17 版本 FROM ubuntu 20 04
  • 如何将文件透明地传输到浏览器?

    受控环境 IE8 IIS 7 ColdFusion 当从 IE 发出指向媒体文件 例如 mp3 mpeg 等 的 GET 请求时 浏览器将启动关联的应用程序 Window Media Player 我猜测 IIS 提供文件的方式允许应用程序
  • 检查 Android 手机上的方向

    如何查看Android手机是横屏还是竖屏 当前配置用于确定要检索的资源 可从资源中获取Configuration object getResources getConfiguration orientation 您可以通过查看其值来检查方向
  • Spring Data 与 Spring Data JPA 与 JdbcTemplate

    我有信心Spring Data and Spring Data JPA指的是相同的 但后来我在 youtube 上观看了一个关于他正在使用JdbcTemplate在那篇教程中 所以我在那里感到困惑 我想澄清一下两者之间有什么区别Spring
  • 如何在 JFreeChart TimeSeries 图表上显示降雨指数和温度?

    目前 我的 TimeSeries 图表每 2 秒显示一个位置的温度 现在 如果我想每2秒显示一次降雨指数和温度 我该如何实现呢 这是我的代码 import testWeatherService TestWeatherTimeLapseSer
  • 将多模块 Maven 项目导入 Eclipse 时出现问题 (STS 2.5.2)

    我刚刚花了最后一个小时查看 Stackoverflow com 上的线程 尝试将 Maven 项目导入到 Spring ToolSuite 2 5 2 中 Maven 项目有多个模块 当我使用 STS 中的 Import 向导导入项目时 所
  • 如何在 Maven 中显示消息

    如何在 Maven 中显示消息 在ant中 我们确实有 echo 来显示消息 但是在maven中 我该怎么做呢 您可以使用 antrun 插件
  • Java - 不要用 bufferedwriter 覆盖

    我有一个程序可以将人员添加到数组列表中 我想做的是将这些人也添加到文本文件中 但程序会覆盖第一行 因此这些人会被删除 如何告诉编译器在下一个空闲行写入 import java io import java util import javax
  • 查看Jasper报告执行的SQL

    运行 Jasper 报表 其中 SQL 嵌入到报表文件 jrxml 中 时 是否可以看到执行的 SQL 理想情况下 我还想查看替换每个 P 占位符的值 Cheers Don JasperReports 使用 Jakarta Commons
  • Azure 共享计划上的 SSL?

    我有 1 个网站 1 个数据库和 1 个 SSL 托管在 azure 上 我曾经拥有 基本 托管套餐 但每个月要支付 70 美元才能获得基本设置 并且所有内容都具有最小的缩放比例 我意识到我的低流量站点不需要专用计算机 因此我尝试转向共享计
  • Jackson 将单个项目反序列化到列表中

    我正在尝试使用一项服务 该服务为我提供了一个带有数组字段的实体 id 23233 items name item 1 name item 2 但是 当数组包含单个项目时 将返回该项目本身 而不是包含一个元素的数组 id 43567 item

随机推荐

  • Spring Boot使用Scheduled完成自动任务

    说明 Scheduled注解可以控制方法定时执行 其中有三个参数可选择 1 fixedDelay控制方法执行的间隔时间 是以上一次方法执行完开始算起 如上一次方法执行阻塞住了 那么直到上一次执行完 并间隔给定的时间后 执行下一次 2 fix
  • layui php phpexcel导出,Yii2 基于 layui 的 Excel 上传并导入数据(含分页)

    安装命令 composer require phpoffice phpexcel 引入layui包 我这里用的是2 4 5的版本 请自行下载对应版本 layui前台页面 导入文件 卡号信息 layui use form element up
  • 【python随笔】之【将doc、docx文件保存为txt文件】

    import win32com client def change word to txt word path save path print 读取中 word win32com client Dispatch Word Applicati
  • vector 操作

    C 内置的数组支持容器的机制 但是它不支持容器抽象的语义 要解决此问题我们自己实现这样的类 在标准C 中 用容器向量 vector 实现 容器向量也是一个类模板 标准库vector类型使用需要的头文件 include
  • 汇编语言笔记-keil5软件仿真及调试

    目录 keil5调试功能 软件仿真设置 硬件调试设置 调试方法 调试选项及介绍 调试窗口 Command Disassembly Symbols Registers Call Stack Locals Watch Memory Serial
  • 赶快进来!!!手把手教你贪吃蛇

    一 大体框架 这里和前面写过的游戏一样 大体框架都是这样 有个简要的目录 我们主要是对play 函数进行封装 由于我们引用了自己的头文件 game h 所以我们可以把所要引用的库函数的预处理指令都放在 game h 的头文件中 如果你细心的
  • Vue3中vuex的基本使用

    一 基本结构 src store index js中 代码如下 vue3中创建store实例对象的方法createStore 按需引入 import createStore from vuex export default createSt
  • pywt 安装学习

    安装 conda install c conda forge pywavelets github地址 里面有demo https github com PyWavelets pywt 这个是学习笔记 https blog csdn net
  • UPC--扑克牌

    题目描述 从一副含有n n 10000 张的扑克牌 显然每张扑克牌都不相同 中 分给m m 100 个人 第i个人得到ai 0 ai 100 张牌 求一共有几种分法 这个数可能非常大 请输出此数模10007后的结果 输入 第一行两个整数 为
  • HDU1874 单源最短路经 dijkstra或者floyd

    include
  • 3、域渗透详解

    在渗透测试过程中 我们经常会遇到以下场景 某处于域中的服务器通过路由做端口映射 对外提供web服务 我们通过web脚本漏洞获得了该主机的system权限 如果甲方有进一步的内网渗透测试需求 以证明企业所面临的巨大风险 这个时候就需要做内网的
  • 模拟IC应届生都这么牛,我想到了崩溃

    再过两个月就到学弟学妹找工作的高峰期了 做为一个2007年的毕业生 能为学弟学妹做的 就是把我去年到今年找工作的经历和经验与他们分享 希望大家都能找到合适的工作 因为本人是模拟ic设计方向的 所以只能介绍些模拟ic设计方面的找工作经验 其实
  • SVM如何避免过拟合

    过拟合 Overfitting 表现为在训练数据上模型的预测很准 在未知数据上预测很差 过拟合主要是因为训练数据中的异常点 这些点严重偏离正常位置 我们知道 决定SVM最优分类超平面的恰恰是那些占少数的支持向量 如果支持向量中碰巧存在异常点
  • pyside6中QcommandLinkButton 控件qss有哪些用法和案例

    QCommandLinkButton 是 Qt GUI 框架中的一个功能按钮类 而 Qt Style Sheets QSS 提供了一种强大的方式来自定义 Qt 控件的外观 以下是 QCommandLinkButton 常用的 QSS 用法
  • 比亚迪半导体IPO再生波折:又被中止审核 红杉小米是股东

    雷递网 雷建平 4月1日报道 2022年1月底刚刚过会的比亚迪半导体上市再生波折 于2022年3月31日的审核再度被中止 这不是比亚迪半导体IPO审核第一次被深交所中止 2021年8月8日 因律师北京市天元律师事务所被中国证监会立案调查 比
  • [从零开始学DeepFaceLab-16]: 使用-命令行八大操作步骤-第6步:模型的选择与训练 - 进阶 - SAEHD模型训练参数详解与优化

    目录 前言 第1章 SAEHD模型训练参数详解 1 1 SAEHD参数汇总 默认 1 2 参数详解
  • 手把手教你:解决python UnicodeDecodeError: 'gb2312' codec can't decode问题

    问题 UnicodeDecodeError gb2312 codec can t decode bytes in position 2 3 illegal multibyte sequence 原因 python在做将普通字符串转换为uni
  • 【Github Action】使用ssh-deploy上传文件的小坑

    可以使用这个Github Action上传文件到服务器 https github com easingthemes ssh deploy README中描述了使用方法 name Deploy to Staging server uses e
  • FastAPI从入门到实战(13)——常见配置项

    这一部分的内容主要是一些常见的配置 包括路由 静态文件等 还包括一些路径和文档的修饰器 包括简介 标签参数等内容 配置静态文件 from fastapi import FastAPI from fastapi staticfiles imp
  • jvisualvm ssl远程连接JVM

    jvisualvm 远程ssl连接 文章目录 一 没认证的 JMX连接 不安全 二 SSL证书认证的JMX连接 安全 1 进入生成证书的目录 并执行脚本 2 一键生成密钥脚本 3 服务器端运行jar包时 开启ssl连接 4 客户端远程SSL