活动MQ JMX SSL

时间:2011-08-10 20:55:56

标签: ssl activemq jmx

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

使用说明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所示,并且工作正常。

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

2 个答案:

答案 0 :(得分:0)

您是否在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

答案 1 :(得分:0)

我在XML中的ActiveMQ SSL配置(密钥库和密码)方面遇到了同样的问题。

我的要求是通过SSL启用ActiveMQ的远程JMX监控和身份验证。

我使用自定义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代理中配置端口。