2011-08-10 101 views
3

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

使用说明书here,我成立了managementContext在activemq.xml中如下:

<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> 

本节似乎在连接器启动时被完全忽略。我可以连接没有凭据。我也尝试使用用户名和密码身份验证,而不是用于JMX的SSL,如here,并且工作正常。

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

+0

嗨,我面临同样的问题。你有没有找到解决办法? – Satyaprakash

回答

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 
0

我关于在XML中的ActiveMQ SSL配置(密钥库&密码)不工作了同样的问题。

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

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

看到:JMX connectivity through a firewall为一个例子(JMXAgent.java)

在JMXAgent配置SSL的重要的项。Java是:

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地图指定的认证文件:

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的代理需要描述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代理进行配置。