Liberty 用の JMX Java クライアントの開発
Libertyの保護された REST コネクターにアクセスするための Java™ Management Extensions (JMX) クライアント・アプリケーションを開発できます。
Liberty 用の JMX Java クライアントの開発に関する最新資料は、 Open Liberty Web サイトから入手できます。
このタスクについて
JMX リモート・クライアント・アプリケーションを使用して、JMX プログラミングを介して Liberty を管理できます。
この構成では、アクセスを必要とするすべてのユーザーに対して、 Liberty で管理ロール・マッピングを実行する必要があります。
ユーザー認証がシングル・サインオン・テクノロジー (例えば、SAML、OpenID Connect、JWT など) を使用して実行される場合、ユーザーは構成済みのユーザー・レジストリーに存在している必要があります。 構成済みのユーザー・レジストリーがない場合、または、ユーザーが構成済みのユーザー・レジストリーに存在しない場合、REST コネクターのクライアント・サイドを使用できません。 REST コネクターのクライアント・サイドは、wlp/clients/restConnector.jar ファイル内にあります。 代わりに、HTTPS 呼び出しを介して直接 REST コネクターにアクセスすることもできます。
手順
- 以下のサンプル・アプリケーション・コードから開始します。 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) { ... } } } - サーバーが実稼働環境以外の環境のサーバー鍵ストアを生成する場合、その鍵ストアをアプリケーション・クライアントのトラストストアとして使用します。
サーバーが実稼働環境以外の環境用に生成する鍵ストアには、クライアントの証明書が含まれています。
デフォルトでは、アプリケーション・クライアントのトラストストア・ファイルは ${server.output.dir}/resources/security/key.p12 です。
19.0.0.2 以前の場合、デフォルトでは、アプリケーション・クライアントのトラストストア・ファイルは ${server.output.dir}/resources/security/key.jks です。
-
javax.net.ssl.trustStoreTypeプロパティーを設定します。デフォルトの key.p12 鍵ストア・ファイルを使用する場合、javax.net.ssl.trustStoreType プロパティーを PKCS12 に設定します。 デフォルトの鍵ストア・ファイルを使用しない場合は、プロパティーに適切な鍵ストア・タイプを設定してください。
バージョン 19.0.0.2 以前では、デフォルトの Java 鍵ストア (JKS) タイプを使用する場合、この行を削除してプロパティーを設定します。
-
JMXConnector.CREDENTIALSプロパティーの userid および password の値を置き換えます。 管理者ユーザーの ID とパスワードをサーバーに使用してください。 - 以下のいずれかの方法で、JMXServiceURL コンストラクター内にサーバーのホスト名とポート番号を設定します。
- HTTPS ポート番号を使用します。 デフォルトの数値は
9443です。 - ファイル ${server.output.dir}/logs/state/com.ibm.ws.jmx.rest.address の内容を JMXServiceURLconstructor パラメーターとして使用します。 プログラムは、REST エンドポイント (
service:jmx:rest://localhost:9443/IBMJMXConnectorRESTなど) を含む構成済みの restConnector-2.0 フィーチャーでサーバーが始動したときに、このファイルを書き込みます。
- HTTPS ポート番号を使用します。 デフォルトの数値は
- 異なるホスト・マシンでクライアント・アプリケーションを実行する場合、リモート・ホストからの接続を受け入れるようにサーバー HTTP エンドポイントを構成します。例えば、アスタリスク (*) を defaultHttpEndpoint エンドポイントのホスト属性として使用します。
<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" }); ... - オプション: 環境マップを使用して 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 ソケット・ファクトリーを使用してソケットを取得できます。
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);