全部。
一直在尝试使用 JAAS 身份验证获取远程 JMX 以在 Camel 版本 2.10.3 + Java 6 中工作。
该应用程序使用 Java DSL 并且是“手动连接的”,并使用系统属性运行:
-Dcom.sun.management.jmxremote.authenticate=true
-Djmx.remote.x.login.config=StagingJmxAuthConfig
-Dorg.apache.camel.jmx.usePlatformMBeanServer=true
-Djava.security.auth.login.config=./src/main/resources/conf/ldap-auth.config
-Dcom.sun.management.jmxremote.ssl=false
-Dorg.apache.camel.jmx.createRmiConnector=true
-Dorg.apache.camel.jmx.rmiConnector.registryPort=9140
但是,出于所有意图和目的,我似乎还不如在关闭身份验证/授权的情况下运行。
调试 JRE 的 JMX 和 JAAS 类(以及 Camel),请注意以下几点:
在课堂上org.apache.camel.management.DefaultManagementAgent
:
cs = JMXConnectorServerFactory.newJMXConnectorServer(url, null, server);
这反过来又为构造函数参数创建了一个javax.management.remote.rmi.RMIJRMPServerImpl
带有空 Map的实例。env
现在,我想知道是否有什么东西让我忽略了——当请求稍后到达连接器时,并且javax.management.remote.rmi.RMIServerImpl
执行 adoNewClient()
时,它不可能触发任何 JAAS 活动?
RMIServerImpl 的第 197-208 行 - 记住 Camel 将“env”设置为null
,它被转换为空映射:
JMXAuthenticator authenticator =
(JMXAuthenticator) env.get(JMXConnectorServer.AUTHENTICATOR);
if (authenticator == null) {
/*
* Create the JAAS-based authenticator only if authentication
* has been enabled
*/
if (env.get("jmx.remote.x.password.file") != null ||
env.get("jmx.remote.x.login.config") != null) {
authenticator = new JMXPluggableAuthenticator(env);
}
}
我是否正确假设要远程,JAAS 认证的 JMX 工作必须手动编写 JMX RMI 连接器设置?
Camel 不应该提供一个让 JAAS 工作的环境吗?甚至似乎都没有触及 JAAS 配置文件......
更新:已解决
在 VM 上设置以下系统属性可以解决问题:
-Dcom.sun.management.jmxremote=true
-Dcom.sun.management.jmxremote.port=9410
-Dcom.sun.management.jmxremote.authenticate=true
-Djmx.remote.x.login.config=StagingJmxAuthConfig
-Dorg.apache.camel.jmx.usePlatformMBeanServer=true
-Djava.security.auth.login.config=./src/main/resources/conf/ldap-auth.config
-Dcom.sun.management.jmxremote.ssl=false
-Dorg.apache.camel.jmx.createRmiConnector=false
-Dcom.sun.management.jmxremote.login.config=StagingJmxAuthConfig
对于我们来说,使用安全的 LDAP,以下是登录配置:
StagingJmxAuthConfig {
com.sun.security.auth.module.LdapLoginModule REQUIRED
java.naming.security.authentication="simple"
java.naming.security.principal="cn=Directory Manager"
java.naming.security.credentials="PASSWORD"
userProvider="ldap://LDAPHOST:389/BASEDN"
userFilter="(&(uid={USERNAME})(appRole=SOME_VALUE))"
authzIdentity=monitorRole
debug=true
useSSL=false;
};
现在我可以使用 jmxterm 进行连接:
java -jar jmxterm-1.0-alpha-4-uber.jar -l service:jmx:rmi:///jndi/rmi://THEHOST:9410/jmxrmi -u LDAPUSER -p LDAPPASS
请注意,JNDI RMI 名称缺少“/camel”后缀——这似乎是唯一的区别。
万岁!