Как настроить интерфейс удаленного доступа SSL JMX на приложении в докере

Это следует из " Как получить доступ к интерфейсу JMX в Docker извне?", В котором говорится о настройке незашифрованных соединений JMX.

Я мог бы использовать либо RMI или же JMXMP который Glassfish использует.

Существует набор параметров JVM, которые требуются, и я ищу изменения, необходимые для настройки JMX с SSL:

com.sun.management.jmxremote=true
com.sun.management.jmxremote.local.only=false
com.sun.management.jmxremote.ssl=true
com.sun.management.jmxremote.authenticate=true
com.sun.management.jmxremote.port=12345
com.sun.management.jmxremote.rmi.port=12346
java.rmi.server.hostname=10.11.12.176
com.sun.management.jmxremote.access.file=/.secure/jmxremote.access
com.sun.management.jmxremote.password.file=/.secure/jmxremote.pass
com.sun.management.jmxremote.login.config=ldap-ad-config
java.net.preferIPv4Stack=true
com.sun.management.jmxremote.ssl.config.file=/.secure/jmxremotessl.properties
javax.net.ssl.keyStore=/config/app.jks
javax.net.ssl.keyStorePassword=teabag
javax.net.ssl.trustStore=/config/cacerts
javax.net.ssl.trustStorePassword=milk

Проблема та же:

java.rmi.ConnectException: Connection refused to host: 172.0.0.85; nested exception is
    java.net.ConnectException: Operation timed out

Этот IP-адрес является внутренним IP-адресом контейнера Docker. Я предполагаю, что это происходит несмотря на java.rmi.server.hostname решение, потому что это на SSL.

Я попытался изменить прокси SSL на non-SSL с nginx, но это не удалось с ошибкой

java.rmi.ConnectIOException: non-JRMP server at remote endpoint

поэтому я думаю, что я должен пересылать дополнительные заголовки в nginx.

Сейчас я пытаюсь настроить JMXMP, но документация о том, как это сделать, довольно тонкая на месте. Существует реализация Spring и реализация Glassfish, но не с документами, которые можно найти (пока) - поэтому я добавляю тег glassfish.

1 ответ

Ответ в том, что я могу настроить свое приложение на использование JMXMP и настроить его для реализации TLS соединения с использованием этих параметров JVM:

-Dcom.sun.management.jmxremote=true
-Dcom.sun.management.jmxremote.local.only=false
-Dcom.sun.management.jmxremote.authenticate=true
-Dcom.sun.management.jmxremote.ssl=true
-Dcom.sun.management.jmxremote.access.file=C:/dev/.secure/jmxremote.access
-Dcom.sun.management.jmxremote.password.file=C:/dev/.secure/jmxremote.pass
-Dcom.sun.management.jmxremote.login.config=spnego-server
-Djava.net.preferIPv4Stack=true
-Dcom.sun.management.jmxremote.ssl.config.file=/.secure/jmxremotessl.properties

Однако я должен кодировать класс конфигурации, чтобы запустить JMXConnectorServer вот так:

@Configuration
public class JmxServer {

    public JmxServer(
            @Value("${jmx.remote.hostname}") final String hostname,
            @Value("${jmx.remote.port}") final String port) {
        try {
            Map<String, Object> env = new HashMap<>();
            env.put("jmx.remote.profiles", "TLS SASL/PLAIN");
            env.put(JMXConnector.CREDENTIALS,
                    new String[] {"myusername", "password"});
            JMXConnectorServerFactory.newJMXConnectorServer(
                    new JMXServiceURL(
                            String.format("service:jmx:jmxmp://%s:%s",
                                    hostname, port)),
                    env,
                    ManagementFactory.getPlatformMBeanServer()
            ).start();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

Но это только половина. Я сейчас спорю с JConsole, чтобы заставить его сделать JMXMP с TLS,

Для этого я следую за этим ископаемым вопросом 2007 года на форумах Oracle:

Может ли JConsole подключиться к удаленному агенту JMX, используя JMXMP и TLS?

но все еще борется...

Другие вопросы по тегам