如何通过JMX连接ActiveMQ Artemis时用SSL证书替代用户名密码认证
切换ActiveMQ Artemis JMX连接至SSL证书认证
一、证书准备
- 证书类型:采用JKS或PKCS12格式的证书文件:
keyStore:客户端身份证书(双向认证场景需要,用于服务端验证客户端身份)trustStore:存放信任的证书(必须配置,用于客户端验证服务端身份,通常包含服务端证书或签发服务端证书的CA)
- 证书放置:将证书文件放入项目的
resources目录下,便于通过类路径加载,避免硬编码绝对路径。 - 自签证书处理:若使用自签证书,需将服务端证书导入客户端的trustStore,执行以下命令(替换对应参数):
keytool -import -alias artemis-server -file server.crt -keystore client-truststore.jks
二、修改JMX连接代码
移除原用户名密码认证逻辑,添加SSL证书相关配置,以下是修改后的完整代码:
import java.util.HashMap; import java.util.Map; import java.util.logging.Level; import java.util.logging.Logger; import javax.management.MBeanServerConnection; import javax.management.remote.JMXConnector; import javax.management.remote.JMXConnectorFactory; import javax.management.remote.JMXServiceURL; public static MBeanServerConnection connectBroker(String brokerUrl, String keyStorePath, String keyStorePass, String trustStorePath, String trustStorePass) { MBeanServerConnection mBeanServerConnection = null; try { // 配置SSL相关系统属性(也可通过JVM启动参数传入:-Djavax.net.ssl.keyStore=...) System.setProperty("javax.net.ssl.keyStore", keyStorePath); System.setProperty("javax.net.ssl.keyStorePassword", keyStorePass); System.setProperty("javax.net.ssl.trustStore", trustStorePath); System.setProperty("javax.net.ssl.trustStorePassword", trustStorePass); // 单向认证场景:仅保留trustStore相关配置,删除keyStore配置即可 Map<String, Object> env = new HashMap<>(); // 指定JMX连接使用SSL协议 env.put("jmx.remote.profiles", "SSL"); JMXServiceURL jmxUrl = new JMXServiceURL("service:jmx:rmi:///jndi/rmi://" + brokerUrl + "/jmxrmi"); JMXConnector connector = JMXConnectorFactory.connect(jmxUrl, env); mBeanServerConnection = connector.getMBeanServerConnection(); DialogsAlert.brokerJmxRmiConnectionSuccess.showAndWait(); Logger.getLogger(YourClassName.class.getName()).log(Level.INFO, "Success connected to broker: " + brokerUrl); } catch (Exception e) { Logger.getLogger(YourClassName.class.getName()).log(Level.WARNING, "Failed to connect to broker", e); } return mBeanServerConnection; }
三、关键配置说明
- 证书路径动态加载:若证书放在项目
resources下,可通过类路径动态获取路径,避免硬编码:String keyStorePath = Thread.currentThread().getContextClassLoader().getResource("client-keystore.jks").getPath(); String trustStorePath = Thread.currentThread().getContextClassLoader().getResource("client-truststore.jks").getPath(); - 单向/双向认证切换:
- 单向认证:仅需配置
trustStore,删除keyStore相关的系统属性即可(服务端不验证客户端身份,客户端仅验证服务端) - 双向认证:同时配置
keyStore和trustStore(双方互相验证身份)
- 单向认证:仅需配置
- Broker端SSL配置:确保ActiveMQ Artemis的JMX已启用SSL,在
broker.xml中配置:<jmxConnector name="rmi" port="1099" ssl-enabled="true"> <key-store path="server-keystore.jks" password="your-keystore-pass"/> <trust-store path="server-truststore.jks" password="your-truststore-pass"/> </jmxConnector>
内容的提问来源于stack exchange,提问作者user21871375
相关产品推荐
相关产品推荐

