開發 Liberty 的 JMX Java 用戶端
您可以開發 Java™ 管理延伸 (JMX) 用戶端應用程式來存取 Liberty 的安全 REST 連接器。
關於這項作業
您可以利用 JMX 遠端用戶端應用程式,透過 JMX 程式設計來管理 Liberty。
程序
- 請從下列範例應用程式碼開始。在應用程式類別路徑 liberty_home/clients/restConnector.jar 中,新增 Liberty REST 連接器用戶端程式庫。
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) { ... } } }
- 如果伺服器針對非正式作業環境產生伺服器金鑰儲存庫,請使用該金鑰儲存庫作為應用程式用戶端的信任儲存庫。 伺服器為非正式作業環境產生的金鑰儲存庫含有用戶端憑證。依預設,應用程式用戶端的信任儲存庫檔案是 ${server.output.dir}/resources/security/key.jks。
- 設定 javax.net.ssl.trustStoreType 內容。如果您使用預設 Java 金鑰儲存庫 (JKS) 類型,請移除此行。
- 取代 JMXConnector.CREDENTIALS 內容的 userid 和 password 值。使用伺服器的管理者使用者 ID 和密碼。
- 使用下列其中一種方法,在 JMXServiceURL 建構子中設定伺服器的主機名稱和埠號:
- 使用 HTTPS 埠號。預設號碼是 9443。
- 使用 ${server.output.dir}/logs/state/com.ibm.ws.jmx.rest.address 檔的內容作為 JMXServiceURLconstructor 參數。當伺服器在啟動時使用了所配置的 restConnector-2.0 特性,並且包含 REST 端點(例如 service:jmx:rest://localhost:9443/IBMJMXConnectorREST)時,程式會寫入這個檔案。
- 如果要在不同的主機上執行用戶端應用程式,請配置伺服器 HTTP 端點,以接受來自遠端主機的連線。 例如,使用星號 (*) 作為 defaultHttpEndpoint 端點的 host 屬性。
<httpEndpoint id="defaultHttpEndpoint" httpPort="9080" httpsPort="9443" host="*" />
- 選擇性的: 停用 Secure Sockets Layer (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" }); ...
- 選擇性的: 利用環境 Map 來配置 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); ...
- 選擇性的: Liberty REST 連接器容許使用特定的自訂 SSL Socket Factory 來取得 Socket。如果顯示異常狀況 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,然後透過 REST 連接器,從該環境定義使用 SocketFactory。
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);
下一步
上層主題: 配置通往 Liberty 的安全 JMX 連線
相關工作:

檔名:twlp_dev_jmxclient.html