通过SSL将Jconsole连接至GCP上的Java应用(经JNDI连接JMX)
解决Jconsole通过SSL+JNDI RMI语法连接SpringBoot应用的问题
问题原因
non-JRMP server at remote endpoint错误的核心是:启用SSL后,服务端的JMX RMI端口已切换为SSL加密通信,但使用JNDI语法连接时,客户端未显式启用SSL,导致RMI尝试用明文JRMP协议连接SSL端口,出现协议不匹配。
正确配置与连接命令
1. 确认服务端VM参数(必须包含SSL相关配置)
确保SpringBoot应用的启动VM参数包含以下内容:
-Dcom.sun.management.jmxremote=true -Dcom.sun.management.jmxremote.port=1234 -Dcom.sun.management.jmxremote.rmi.port=1234 -Dcom.sun.management.jmxremote.authenticate=false # 按需调整,此处关闭认证简化测试 -Dcom.sun.management.jmxremote.ssl=true -Djavax.net.ssl.keyStore=server.keystore -Djavax.net.ssl.keyStorePassword=qweasd -Djava.rmi.server.hostname=localhost
注意:如果不分开设置注册表和Stub端口,
jmxremote.rmi.port必须和jmxremote.port保持一致,避免端口映射混乱。
2. 客户端正确的Jconsole启动命令(带JNDI语法)
客户端需要同时指定信任库并强制JMX启用SSL,命令如下:
jconsole -debug \ -J-Djavax.net.ssl.trustStore=client.truststore \ -J-Djavax.net.ssl.trustStorePassword=qweasd \ -J-Dcom.sun.management.jmxremote.ssl=true \ service:jmx:rmi:///jndi/rmi://localhost:1234/jmxrmi
关键注意点
- 必须显式添加
-Dcom.sun.management.jmxremote.ssl=true:仅指定信任库不足以触发SSL连接,必须强制JMX使用SSL协议与RMI通信。 - 信任库有效性:
client.truststore必须导入服务端server.keystore的证书,否则会出现SSL握手失败。 - 端口一致性:服务端的
jmxremote.port和jmxremote.rmi.port要与JNDI URL中的端口保持一致。
内容的提问来源于stack exchange,提问作者bua
相关产品推荐
相关产品推荐

