Подключение к удаленным агентам JMX с включенным и отключенным SSL с одинаковой средой подключения - PullRequest
0 голосов
/ 18 января 2019

У меня есть программа, которая отслеживает данные о производительности процесса от удаленных агентов JMX.

Некоторые из этих удаленных агентов настроены на использование SSL, задав для аргументов JVM com.sun.management.jmxremote.ssl и com.sun.management.jmxremote.registry.ssl значение true. Другие не защищены SSL, устанавливая эти аргументы JVM в false.

Я подключаюсь к этим удаленным агентам, используя JMXConnector следующим способом:

private JMXConnector setUpConnection(String server, int jmxPort) {

    try {

        Registry r = LocateRegistry.getRegistry(server, jmxPort);

        HashMap<String, Object> env = new HashMap<String, Object>();

        String[] credentials = {"username", "password"};
        env.put(JMXConnector.CREDENTIALS, credentials);
        env.put("com.sun.jndi.rmi.factory.socket", new SslRMIClientSocketFactory());  // uncomment if needed


                JMXServiceURL url = new JMXServiceURL("service:jmx:rmi:///jndi/rmi://" + server + ":" + jmxPort + "/jmxrmi");
        return JMXConnectorFactory.newJMXConnector(url, env);

    } catch (Exception e) {
        e.printStackTrace();
    }
    return null;

}

Этот подход позволяет подключаться к моим удаленным агентам, защищенным SSL, но не к удаленным агентам, которые не используют SSL. В последнем случае я получаю сообщение об ошибке:

java.io.IOException: Failed to retrieve RMIServer stub: javax.naming.CommunicationException [Root exception is java.rmi.ConnectIOException: error during JRMP connection establishment; nested exception is: 
    javax.net.ssl.SSLHandshakeException: Remote host closed connection during handshake]

Если я уберу следующую строку:

env.put("com.sun.jndi.rmi.factory.socket", new SslRMIClientSocketFactory());

Затем происходит обратное, теперь я могу подключаться к удаленным агентам, которые не настроены на использование SSL, но не могут подключиться к удаленным агентам SSL. В этом случае я получаю сообщение об ошибке для удаленных агентов, настроенных по протоколу SSL:

java.io.IOException: Failed to retrieve RMIServer stub: javax.naming.CommunicationException [Root exception is java.rmi.ConnectIOException: non-JRMP server at remote endpoint]

Если я не установлю для аргумента JVM com.sun.management.jmxremote.registry.ssl значение true, тогда я смогу подключиться ко всем своим удаленным агентам, когда опущу:

env.put("com.sun.jndi.rmi.factory.socket", new SslRMIClientSocketFactory());

Однако установка этого свойства в false не является опцией.

Я хочу во что бы то ни стало избежать двух разных сред соединений: одну для удаленных агентов SSL и другую для удаленных агентов не-SSL. Я также не могу перенести все мои удаленные агенты на настройку SSL.

1 Ответ

0 голосов
/ 21 января 2019

В одном из наших проектов мы использовали приведенный ниже фрагмент кода для получения JMXConnection.

private String provider = "";
private String jvmPort = "";
private JMXServiceURL jmxService = null;
private JMXConnector jmxConnector = null;
private RMIConnector rmiConnector = null;
private MBeanServerConnection beanServerConn = null;
.........

public boolean connectToJVM(String jvmURL, String user, String pass)
{
    boolean flag = false;
    beanServerConn = null ;  
    try
    {
        jmxService = new JMXServiceURL(jvmURL);
        Map environment = new HashMap();
        int jmxconnect_timeout = 30000;
        environment.put("jmx.remote.protocol.provider.pkgs",provider);
        if (jmxconnect_timeout > 0) {
            environment.put("jmx.remote.x.request.waiting.timeout", Long.toString(jmxconnect_timeout));
        }
        boolean registrySSL = false;

        if(user.equalsIgnoreCase("none")|| (pass.equalsIgnoreCase("none")))
        {
            try
            {
                jmxConnector = JMXConnectorFactory.connect(jmxService,environment);
            }
            catch(IOException ioe)
            {
                registrySSL = true;
            }
        }
        else
        {
            String [] credentials={user,pass};
            environment.put(JMXConnector.CREDENTIALS, credentials);
            try
            {
                jmxConnector = JMXConnectorFactory.connect(jmxService,environment);
            }
            catch(IOException ioe)
            {
                registrySSL = true;
            }
        }

        if(registrySSL)
        {
            /*
                This if block runs when the "management.properties" file contains 
                com.sun.management.jmxremote.registry.ssl=true

                This block of code is applicable both JDK5.0 & 6.0

                Only for JDK6.0
                ===============
                    environment.put("com.sun.jndi.rmi.factory.socket", new SslRMIClientSocketFactory());
                    beanServerConn = jmxConnector.getMBeanServerConnection();
            */

            try {
                MySslRMIClientSocketFactory csf = new MySslRMIClientSocketFactory(targetHost, Integer.parseInt(jvmPort), (int)jmxconnect_timeout);
                Registry registry = LocateRegistry.getRegistry(targetHost, Integer.parseInt(jvmPort), csf);
                RMIServer stub = (RMIServer) registry.lookup(jndiName);
                rmiConnector = new RMIConnector(stub, environment);
                rmiConnector.connect(environment);
                beanServerConn = rmiConnector.getMBeanServerConnection();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        else{
            beanServerConn = jmxConnector.getMBeanServerConnection();
        }

        if(beanServerConn == null)
        {
            System.out.println("Connection to JVM is not established for url : " + url);
            return false;
        }
        else
        {
            flag = true;
        }
    }
    catch(Exception ex)
    {
        System.out.println("Connection to JVM is not established for url : " + url);
        //ex.printStackTrace();
        return false;
    }
    return flag;
}
...