Соединение Tomcat JMX - Ошибка аутентификации

У меня возникли проблемы с настройкой Tomcat для 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. Я написал клиентский инструмент, который подключается к серверу JMX, работающему через порт 18070. Когда я запускаю клиентскую программу, я получаю следующую ошибку.

    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 с другого компьютера.

Под удаленным доступом они подразумевают доступ к серверу JMX с любой виртуальной машины локально или удаленно?

Редактировать

Спасибо. Я обнаружил, что проблема заключалась в том, что, хотя я указывал имя пользователя и пароль в файлах jmxremort.password и jmxremote.access, мне все равно приходилось указывать имя пользователя и пароль от клиента.

Вы правы, что мне не нужно предоставлять учетные данные пользователя при локальном запуске. Я доказал это, поскольку могу получить доступ к JVM Tomcat через Jconsole.

Я получаю к нему доступ программно, поэтому мне нужно предоставить URL-адрес, который показан ниже service: 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

Спасибо


person ziggy    schedule 13.01.2011    source источник
comment
дубликат - не могли бы вы сжать эти запросы ...   -  person mtraut    schedule 13.01.2011
comment
Я обнаружил, что проблема заключалась в том, что, хотя я указывал имя пользователя и пароль в файлах jmxremort.password и jmxremote.access, мне все равно приходилось указывать имя пользователя и пароль от клиента. - конечно, jmxremote.access служит хранилищем паролей, поэтому вы должны пройти аутентификацию с вашим клиентом JMX   -  person davorp    schedule 14.01.2011


Ответы (1)


Удаленный доступ

Удаленный доступ означает доступ с другой машины для локального доступа через другую виртуальную машину не нужно устанавливать JMX [примечание 1]. Вы можете попробовать это, запустив Java-приложение без JMX, а затем запустите VisualVM на том же компьютере. Запущенное приложение должно появиться в разделе «Локальный» (в VisualVM).

В качестве исключения указано: Authentication failed! Credentials required вы указали имя пользователя и пароль? ;) Думаю, ты сделал ...

Возможное решение

Если вы это сделали, вам следует попытаться удалить $CATALINA_BASE из CATALINA_OPTS и ввести жестко запрограммированное значение, просто чтобы увидеть, является ли это основной проблемой.

пример:

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, вам нужно было установить следующее системное свойство (com.sun.management.jmxremote) при запуске виртуальной машины Java или приложения Java. Установка этого свойства зарегистрировала компоненты MBeans платформы Java VM и опубликовала коннектор удаленного вызова метода (RMI) через частный интерфейс, чтобы клиентские приложения JMX могли отслеживать локальную платформу Java, то есть Java ВМ, работающая на том же компьютере, что и JMX-клиент. На платформе Java SE 6 больше не требуется устанавливать это системное свойство. Любое приложение, запущенное на платформе Java SE 6, будет поддерживать Attach API, и поэтому будет автоматически при необходимости сделать доступным для локального мониторинга и управления ".

person davorp    schedule 13.01.2011