У меня есть программа, которая отслеживает данные о производительности процесса от удаленных агентов 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.