活动 MQ JMX SSL

Posted

技术标签:

【中文标题】活动 MQ JMX SSL【英文标题】:Active MQ JMX SSL 【发布时间】:2011-10-24 11:10:06 【问题描述】:

我正在尝试将 SSL 与 Active MQ 创建的 JMX 连接器一起使用,但没有成功。我可以让 SSL 与 JVM 平台 JMX 连接器一起工作,但这需要存储密钥库和信任库密码明文,这对我们的项目来说是不行的。

使用指令here,我在activemq.xml中设置managementContext如下:

<managementContext>
  <managementContext createConnector="true">
    <property xmlns="http://www.springframework.org/schema/beans" name="environment">
      <map xmlns="http://www.springframework.org/schema/beans">
        <entry xmlns="http://www.springframework.org/schema/beans"
               key="javax.net.ssl.keyStore"
               value="$activemq.base/conf/keystore.jks"/>
        <entry xmlns="http://www.springframework.org/schema/beans"
               key="javax.net.ssl.keyStorePassword"
               value="$keystore.password"/>
        <entry xmlns="http://www.springframework.org/schema/beans"
               key="javax.net.ssl.trustStore" 
               value="$activemq.base/conf/truststore.jks"/>
        <entry xmlns="http://www.springframework.org/schema/beans" 
               key="javax.net.ssl.trustStorePassword" 
               value="$truststore.password"/> 
      </map>
    </property>
  </managementContext>
</managementContext>

连接器启动时,这部分似乎完全被忽略了。我可以在没有凭据的情况下连接。我还尝试使用用户名和密码身份验证而不是 ssl 进行 JMX,如 here 所示,效果很好。

有人见过这个吗?有任何想法吗?谢谢!

【问题讨论】:

嗨,我也面临同样的问题。你找到解决办法了吗? 【参考方案1】:

您是否在 activemq 启动脚本中启用了 jmx ssl?在 activemq-admin 或 activemq 批处理文件中的窗口上,取消注释并修改 SUNJMX 设置。

JMX 身份验证与是否使用 ssl 无关。它由authenticate 属性控制。默认情况下,它将使用 jre 中的 jmx 访问文件,因此使用如下所示的系统属性重新指向它们。您可能会收到一条错误消息,指出文件本身必须受到访问控制,因此请在 unix 上使用 chmod 或在 Windows 上使用 cacls 设置它们。我建议甚至关闭 ssl 并首先让身份验证工作。您可以使用带有远程连接的 jconsole 进行测试,以确认它需要凭据。然后跟进 ssl 的东西。

set SUNJMX=-Dcom.sun.management.jmxremote=true -Dcom.sun.management.jmxremote.port=1199 -Dcom.sun.management.jmxremote.authenticate=true -Dcom.sun.management.jmxremote.ssl=true -Dcom.sun.management.jmxremote.local.only=false -Dcom.sun.management.jmxremote.password.file=%ACTIVEMQ_BASE%/conf/access/jmx.password -Dcom.sun.management.jmxremote.access.file=%ACTIVEMQ_BASE%/conf/access/jmx.access

【讨论】:

【参考方案2】:

关于 XML 中的 ActiveMQ SSL 配置(密钥库和密码)不起作用,我遇到了同样的问题。

我的要求是启用对 ActiveMQ 的远程 JMX 监控,使用 SSL 并通过防火墙进行身份验证。

我使用自定义 JMX 连接器(通过 Java 代理)解决了这个问题,而不是使用 Active MQ 创建的 JMX 连接器。

参见:JMX connectivity through a firewall 示例 (JMXAgent.java)

在 JMXAgent.java 中配置 SSL 的重要条目是:

Map<String, Object> env = new HashMap<String, Object>();        
SslRMIClientSocketFactory csf = new SslRMIClientSocketFactory();
SslRMIServerSocketFactory ssf = new SslRMIServerSocketFactory();
env.put(RMIConnectorServer.RMI_CLIENT_SOCKET_FACTORY_ATTRIBUTE, csf);
env.put(RMIConnectorServer.RMI_SERVER_SOCKET_FACTORY_ATTRIBUTE, ssf);   

您还可以在 env Map 中指定您的身份验证文件:

env.put("jmx.remote.x.password.file", System.getProperty("password.file","<default_path>"));
env.put("jmx.remote.x.access.file", System.getProperty("access.file","<default_path>"));

Java 代理需要编译并放入具有有效清单文件的 jar 中,如 here 所述

将以下内容添加到activemq启动配置(取决于activemq版本/环境并运行ActiveMQ:

-javaagent:<full_path_to_agent_jar_file> \ 
-Dpassword.file=<full_path_to_jmx.password_file> \
-Daccess.file=<full_path_to_jmx.access_file> \
-Djavax.net.ssl.keyStore=<full_path_to_keystore_file> \
-Djavax.net.ssl.keyStorePassword=<password> 

然后您应该能够通过 jconsole 进行连接(使用正确的安全参数)

远程 JMX 连接 URL 类似于:

service:jmx:rmi://<host>:<rmi_server_port>/jndi/rmi://<host>:<port>/jmxrmi

注意 - 可以在 Java 代理中配置端口。

【讨论】:

以上是关于活动 MQ JMX SSL的主要内容,如果未能解决你的问题,请参考以下文章

具有多个消费者但只有一个活动的 MQ 队列

活动 MQ 嵌入式代理;在生产中实用且可靠?

一个 JMS 消费者停止监听活动的 mq 主题,而第二个没有

如何在活动 mq Web 控制台 localhost:8161 中发送消息的消息头(属性)?

便宜的SSL证书 安信SSL证书新年活动预告

在ssl(ldaps)的支持下连接活动目录