Liberty 开发 JMX Java 客户机

您可以开发 Java™ 管理扩展 (JMX) 客户机应用程序以访问 Liberty的安全 REST 连接器。

Open Liberty 有关为 Liberty 开发 JMX Java 客户机的最新文档在 Open Liberty Web 站点上提供。

有关此任务

通过使用 JMX 远程客户机应用程序,可以通过 JMX 编程来管理 Liberty

在此配置中,必须对需要访问权的所有用户执行 Liberty 上的管理角色映射。

如果使用单点登录技术(例如 SAML、OpenID Connect 或 JWT)执行用户认证,那么用户必须包含在已配置的用户注册表中。 如果没有已配置的用户注册表或者用户未包含在已配置的用户注册表中,那么您无法使用 REST 连接器的客户端。 REST 连接器的客户端包含在 wlp/clients/restConnector.jar 文件中。 但您可以通过 HTTPS 调用直接访问 REST 连接器。

过程

  1. 从以下样本应用程序代码开始。 将 Liberty REST 连接器客户机库添加到应用程序类路径 liberty_home/clients/restConnector.jar
    import javax.management.remote.JMXServiceURL;
    import javax.management.MBeanServerConnection;
    import javax.management.remote.JMXConnector;
    import javax.management.remote.JMXConnectorFactory;
    import java.util.HashMap;
    
    
    public class Test { 
    
      public static void main(String[] args) {
        System.setProperty("javax.net.ssl.trustStore", <truststore location>);
        System.setProperty("javax.net.ssl.trustStorePassword", <truststore password>);
    
        //If the type of the trustStore is not jks, which is default, 
        //set the type by using the following line.
        System.setProperty("javax.net.ssl.trustStoreType", <truststore type>);
       
       try {
          HashMap<String, Object> environment = new HashMap<String, Object>();
          environment.put("jmx.remote.protocol.provider.pkgs", "com.ibm.ws.jmx.connector.client");
          environment.put(JMXConnector.CREDENTIALS, new String[] { "userid", "password" });
    
          JMXServiceURL url = new JMXServiceURL("service:jmx:rest://localhost:9443/IBMJMXConnectorREST");
          JMXConnector connector = JMXConnectorFactory.newJMXConnector(url, environment);
          connector.connect();
          MBeanServerConnection mbsc = connector.getMBeanServerConnection();
        } catch(Throwable t) {
             ...
        }
      }
    }
    
  2. 如果服务器为非生产环境生成服务器密钥库,那么将该密钥库用作应用程序客户机信任库。

    服务器为非生产环境生成的密钥库包含客户机证书。

    缺省情况下,应用程序客户机信任库文件为 ${server.output.dir}/resources/security/key.p12

    (截至 19.0.0.2)缺省情况下,应用程序客户机信任库文件为 ${server.output.dir}/resources/security/key.jks

  3. 设置 javax.net.ssl.trustStoreType 属性。

    如果使用缺省 key.p12 密钥库文件,请将 javax.net.ssl.trustStoreType 属性设置为 PKCS12。 如果未使用缺省密钥库文件,请将该属性设置为相应的密钥库类型。

    在 V 19.0.0.2 和更低版本中,如果使用缺省 Java 密钥库 (JKS) 类型,请除去此行以设置属性。

  4. 替换 JMXConnector.CREDENTIALS 属性的 useridpassword 值。 对服务器使用管理员用户标识和密码。
  5. 在 JMXServiceURL 构造函数中,使用下列其中一种方法来设置服务器的主机名和端口号。
    1. 使用 HTTPS 端口号。 缺省数字为 9443
    2. 使用文件内容 ${server.output.dir}/logs/state/com.ibm.ws.jmx.rest.address 作为 JMXServiceURLconstructor 参数。 当服务器使用配置并包含 REST 端点 (例如 service:jmx:rest://localhost:9443/IBMJMXConnectorREST) 的 restConnector-2.0 功能部件启动时,程序将写入此文件。
  6. 要在另外的主机上运行客户机应用程序,请配置服务器 HTTP 端点以接受来自远程主机的连接。
    例如,使用星号 (*) 作为 defaultHttpEndpoint 端点的 host 属性。
    <httpEndpoint id="defaultHttpEndpoint"
         httpPort="9080"
         httpsPort="9443"
         host="*" />
  7. 可选: 禁用安全套接字层 (SSL) 证书的主机名验证。 随 Liberty 一起安装的证书可能不包含运行服务器的主机名。 如果要禁用 SSL 证书的主机名验证,可以将系统属性 com.ibm.ws.jmx.connector.client.disableURLHostnameVerification 设置为 true,这会对所有连接禁用主机名验证。 要对每个连接禁用主机名验证,请在创建 JMX 连接时将此属性作为新的 environment 传递:
    HashMap<String, Object> environment = new HashMap<String, Object>();
    environment.put("jmx.remote.protocol.provider.pkgs", "com.ibm.ws.jmx.connector.client");
    environment.put("com.ibm.ws.jmx.connector.client.disableURLHostnameVerification", Boolean.TRUE);
    environment.put(JMXConnector.CREDENTIALS, new String[] { "userid", "password" });
    ...
    
  8. 可选: 使用环境映射来配置 JMX REST 连接器设置。
    ...
    HashMap<String, Object> environment = new HashMap<String, Object>();
    environment.put("com.ibm.ws.jmx.connector.client.rest.maxServerWaitTime", 0);
    environment.put("com.ibm.ws.jmx.connector.client.rest.notificationDeliveryInterval", 65000);
    ...
  9. 可选: Liberty REST 连接器允许使用特定定制 SSL 套接字工厂来获取套接字。 如果显示 javax.net.ssl.SSLHandshakeException: com.ibm.jsse2.util.j: PKIX path building failed: java.security.cert.CertPathBuilderException: unable to find valid certification path to requested target 异常,那么您可以从自己的密钥库创建自己的 SSLContext ,然后将该上下文中的 SocketFactory 与 REST 连接器配合使用。
    KeyStore trustStore = KeyStore.getInstance(KeyStore.getDefaultType());
    InputStream inputStream = new FileInputStream("myTrustStore.jks");
    trustStore.load(inputStream, "password".toCharArray());
    TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
    trustManagerFactory.init(trustStore);
    TrustManager[] trustManagers = trustManagerFactory.getTrustManagers();
    SSLContext sslContext = SSLContext.getInstance("SSL");
    sslContext.init(null, trustManagers, null);
     
    Map<String, Object> environment = new HashMap<String, Object>(); 
    environment.put(ConnectorSettings.CUSTOM_SSLSOCKETFACTORY, sslContext.getSocketFactory()); 
    environment.put(ConnectorSettings.DISABLE_HOSTNAME_VERIFICATION, true); 
    environment.put("jmx.remote.protocol.provider.pkgs", "com.ibm.ws.jmx.connector.client"); 
    environment.put(JMXConnector.CREDENTIALS, new String[] { "userid", "password" });          
    JMXServiceURL url = new JMXServiceURL("REST", "localhost", 9443, "/IBMJMXConnectorREST"); 
    jmxConn = JMXConnectorFactory.connect(url, environment);

下一步做什么?

要访问应用程序中的 JMX MBean ,请参阅 访问 MBean 属性和操作的示例