8.4.2. HTTPS でJNDI にアクセス

HTTP/SSL 経由で JNDI にアクセスできるようにするには、Web コンテナーにある SSL コネクタを有効にする必要があります。この詳細については「Tomcat 用にサーブレットコンテナーを統合する」で説明しています。HTTPS URL を JNDI プロバイダー URL として使用するクライアントの簡単な例を使って HTTPS の使いかたを説明します。この例には SSL コネクターの設定を用いますので、SSL コネクターの設定に関する詳細を除き必要なものはすべて含まれています。
また、HTTPS URL を使用するよう HttpProxyFactory 設定構成も提供しています。次の例ではこの設定を提供するためのサンプル例をインストールする http-invoker.sarjboss-service.xml 記述子のセクションを示します。標準 HTTP 設定に相対的に変更されたものは InvokerURLPrefix および InvokerURLSuffix の属性のみで 8443 ポートを使って HTTPS URL を設定します。
<!-- Expose the Naming service interface via HTTPS -->
<mbean code="org.jboss.invocation.http.server.HttpProxyFactory" 
       name="jboss:service=invoker,type=https,target=Naming">
    <!-- The Naming service we are proxying -->
    <attribute name="InvokerName">jboss:service=Naming</attribute>
    <!-- Compose the invoker URL from the cluster node address -->
    <attribute name="InvokerURLPrefix">https://</attribute>
    <attribute name="InvokerURLSuffix">:8443/invoker/JMXInvokerServlet 
</attribute>
    <attribute name="UseHostName">true</attribute>
    <attribute name="ExportedInterface">org.jnp.interfaces.Naming 
</attribute>
    <attribute name="JndiName"/>
    <attribute name="ClientInterceptors">
        <interceptors>
            <interceptor>org.jboss.proxy.ClientMethodInterceptor 
</interceptor>
            <interceptor>org.jboss.proxy.SecurityInterceptor
</interceptor>
            <interceptor>org.jboss.naming.interceptors.ExceptionInterceptor 
</interceptor>
            <interceptor>org.jboss.invocation.InvokerInterceptor 
</interceptor>
        </interceptors>
    </attribute>
</mbean>
少なくとも、HTTPS を使った JNDI クライアントは HTTPS URL プロトコルハンドラーを設定する必要があります。HTTPS 用のJava Secure Socket Extesion (JSSE) を使います。JSSE の文書はHTTPS 使用の要件という面では詳しく説明されていないため、例8.2「トランスポートとしてHTTPS を使う JNDI クライント」にて説明されているクライアントサンプルを設定するには、以下の手順をふむ必要がありました。
  • HTTPS URL のプロトコルハンドラーは Java で利用できるようにする必要があります。JSSE リリースには、com.sun.net.ssl.internal.www.protocolパッケージのHTTPS ハンドラーがあります。HTTPS URLを利用可能にするには、標準のURLプロトコルハンドラーの検索プロパティ java.protocol.handler.pkgs にこのパッケージを含める必要があります。Ant スクリプトにjava.protocol.handler.pkgs プロパティを設定します。
  • SSLを機能させるには、JSSE セキュリティプロバイダーをインストールする必要があります。これは、JSSE jarsを拡張パッケージとしてインストールするか、プログラムでインストールしてください。この例では煩わしい作業が少ないプログラムでの手法を使っています。ExClient コードの18行目で、実施方法が説明されています。
  • JNDI プロバイダー URL は HTTPS をプロトコルとして利用する必要があります。ExClient コードの24-25 行目で、ポート番号8443 が割り当てられたローカルホストへのHTTP/SSL 接続を指定しています。このホスト名とポートは、Web コンテナーの SSL コネクターで定義されています。
  • サーバー証明に対する HTTPS URLのホストネームの検証は無効にする必要があります。デフォルトでは、JSSE HTTPS プロトコルハンドラーが、HTTPS URL のホスト名部分をサーバー証明の共通名をもとに厳密に検証を行います。これは、セキュリティがかかっている Web サイトに接続すると Web ブラウザーが行うチェックと同じです。特定のホスト名ではなく"Chapter 8 SSL Example" の共通名を使用する自己署名サーバー証明を採用しており、これは開発環境やイントラネットで一般的に利用されている場合が多いです。JBoss HttpInvokerProxy は、org.jboss.security.ignoreHttpsHost システムプロパティが存在するか、さらにTrue の値を持っているかを確認するデフォルトのホスト名をオーバーライドします。Ant スクリプトではorg.jboss.security.ignoreHttpsHost プロパティを True に設定します。

例8.2 トランスポートとしてHTTPS を使う JNDI クライント

package org.jboss.chap3.ex1;

import java.security.Security;
import java.util.Properties;
import javax.naming.Context;
import javax.naming.InitialContext;
                    
public class ExClient
{
    public static void main(String args[]) throws Exception
    {
        Properties env = new Properties();
        env.setProperty(Context.INITIAL_CONTEXT_FACTORY,
                        "org.jboss.naming.HttpNamingContextFactory");
        env.setProperty(Context.PROVIDER_URL,
                        "https://localhost:8443/invoker/JNDIFactorySSL");

        Context ctx = new InitialContext(env);
        System.out.println("Created InitialContext, env=" + env);

        Object data = ctx.lookup("jmx/invoker/RMIAdaptor");
        System.out.println("lookup(jmx/invoker/RMIAdaptor): " + data);
    }
}
クライアントのテストを実施するには、まず 3 章の例を構築し chap3 設定ファイルセットを作成します。
[examples]$ ant -Dchap=naming config
次に、naming 設定ファイルセットを使って JBoss サーバーを起動します。
[bin]$ sh run.sh -c naming
最後に、以下を使いExClient を実行します。
[examples]$ ant -Dchap=naming -Dex=1 run-example
...
run-example1:

[java] Created InitialContext, env={java.naming. \ 
provider.url=https://localhost:8443/invoker/JNDIFactorySSL, java.naming. \
factory.initial=org.jboss.naming.HttpNamingContextFactory}
     [java] lookup(jmx/invoker/RMIAdaptor): org.jboss.invocation.jrmp. \
     interfaces.JRMPInvokerP
roxy@cac3fa