[英]Tomcat JMX connection - Authentication failed
我在设置Tomcat for JMX时遇到了一些问题。 我添加了以下属性
CATALINA_OPTS="-Dcom.sun.management.jmxremote.port=18070 -Dcom.sun.management.jmxremote.password.file=$CATALINA_BASE/conf/jmxremote.password -Dcom.sun
.management.jmxremote.ssl=false"
并将jmxremote.password文件添加到conf目录中。 我写了一个连接到端口18070上运行的JMX服务器的客户端工具。当我运行客户端程序时,我收到以下错误。
Exception in thread "main" java.lang.SecurityException: Authentication failed! Credentials required
at com.sun.jmx.remote.security.JMXPluggableAuthenticator.authenticationFailure(JMXPluggableAuthenticator.java:193)
at com.sun.jmx.remote.security.JMXPluggableAuthenticator.authenticate(JMXPluggableAuthenticator.java:145)
at sun.management.jmxremote.ConnectorBootstrap$AccessFileCheckerAuthenticator.authenticate(ConnectorBootstrap.java:185)
at javax.management.remote.rmi.RMIServerImpl.doNewClient(RMIServerImpl.java:213)
at javax.management.remote.rmi.RMIServerImpl.newClient(RMIServerImpl.java:180)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:305)
at sun.rmi.transport.Transport$1.run(Transport.java:159)
at java.security.AccessController.doPrivileged(Native Method)
at sun.rmi.transport.Transport.serviceCall(Transport.java:155)
at sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:535)
at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(TCPTransport.java:790)
at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:649)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:885)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:907)
at java.lang.Thread.run(Thread.java:619)
at sun.rmi.transport.StreamRemoteCall.exceptionReceivedFromServer(StreamRemoteCall.java:255)
at sun.rmi.transport.StreamRemoteCall.executeCall(StreamRemoteCall.java:233)
at sun.rmi.server.UnicastRef.invoke(UnicastRef.java:142)
at javax.management.remote.rmi.RMIServerImpl_Stub.newClient(Unknown Source)
at javax.management.remote.rmi.RMIConnector.getConnection(RMIConnector.java:2312)
at javax.management.remote.rmi.RMIConnector.connect(RMIConnector.java:277)
at javax.management.remote.JMXConnectorFactory.connect(JMXConnectorFactory.java:248)
at com.bt.c21sc.c21tkprobe.accessors.C21TkProbeJmxDAO.connect(Unknown Source)
at com.bt.c21sc.c21tkprobe.service.C21TkProbeBD.execute(Unknown Source)
at com.bt.c21sc.c21tkprobe.C21AppserverProbe.main(Unknown Source)
如果我将CATALINA_OPTS属性更改为
CATALINA_OPTS="-Dcom.sun.management.jmxremote.port=18070 -Dcom.sun.management.jmxremote.password.file=$CATALINA_BASE/conf/jmxremote.password -Dcom.sun
.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false"
然后它工作正常。 我认为我感到困惑的是什么被归类为远程访问。 我正在运行远离Tomcat实例的客户端程序,但Tomcat和客户端工具都在同一台机器上(即不同的虚拟机,但环境相同)。 我想如果我从另一台机器远程访问JMX服务器,我必须配置远程验证。
通过远程访问,它们是指从本地还是远程访问任何VM的JMX服务器?
谢谢。 我发现问题是即使我在jmxremort.password和jmxremote.access文件中提供用户名和密码,我仍然需要从客户端提供用户名和密码。
你是对的,如果在本地运行,我不必提供用户凭据。 我已经证明了这一点,因为我可以通过Jconsole访问Tomcat的JVM。
我以编程方式访问它所以我必须提供一个URL,如下所示:jmx:rmi:/// jndi / rmi:// localhost:9004 / jmxrmi
然后我得到jmx服务器,如下所示。
url = new JMXServiceURL(urlString);
Hashtable<String, String[]> env = new Hashtable<String, String[]>();
String[] credentials = new String[] {user,pass};
env.put(JMXConnector.CREDENTIALS, credentials);
jmxc = JMXConnectorFactory.connect(url,env);
mbsc = jmxc.getMBeanServerConnection();
如果我在本地访问这个我怎么去这个? 我知道它没有用户凭据就无法在本地工作,因为这就是我发现我需要提供的方式。 如果Jconsole或visualvm可以连接到它,那么必须有一种不同的方法允许检索Tomcat jmx服务器而不必提供端口号。
URL包括端口号。 如果以编程方式访问JMX服务器,如何在不指定端口号的情况下访问它?
顺便说一句,我使用的是Tomcat 5.5和JDK 1.6
谢谢
远程访问意味着从另一台计算机访问,通过另一台VM本地访问,您不必设置JMX [注1]。 您可以通过在没有JMX的情况下启动Java应用程序来尝试此操作,然后在同一台计算机上启动VisualVM。 启动的应用程序应显示在“Local”下(在VisualVM中)。
正如异常所述: Authentication failed! Credentials required
您Authentication failed! Credentials required
提供用户名和密码吗? ;)我猜你做到了......
如果你这样做,那么你应该尝试从CATALINA_OPTS中删除$CATALINA_BASE
并输入一个硬编码值,只是为了看看这是否是根本问题。
例:
CATALINA_OPTS =“ - Dcom.sun.management.jmxremote.port = 18070 -Dcom.sun.management.jmxremote.password.file = / opt / tomcat6 /conf/jmxremote.password-Dcom.sun.management.jmxremote.ssl = false “
如果它有效,请尝试这样:
CATALINA_OPTS="-Dcom.sun.management.jmxremote.port=18070
-Dcom.sun.management.jmxremote.password.file=`echo $CATALINA_BASE`/conf/jmxremote.password
-Dcom.sun.management.jmxremote.ssl=false"
[注1]:这里说:“在Java SE平台的先前版本中,为了允许JMX客户端访问本地Java VM,您必须在启动时设置以下系统属性(com.sun.management.jmxremote) Java VM或Java应用程序。设置此属性会注册Java VM平台的MBean并通过专用接口发布远程方法调用(RMI)连接器,以允许JMX客户端应用程序监视本地Java平台,即运行在其上的Java VM与Java J6客户端相同的机器。在Java SE 6平台中,不再需要设置此系统属性。在Java SE 6平台上启动的任何应用程序都将支持Attach API,因此将自动提供在需要时进行本地监控和管理。“
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.