BEA ホーム | 製品 | dev2dev | support | askBEA
 ドキュメントのダウンロード   サイト マップ   Glossary 
検索

WebLogic Web サービス プログラマーズ ガイド

 Previous Next Contents PDF で侮ヲ  

セキュリティのコンフィグレーション

この章では、WebLogic Web サービスのセキュリティをコンフィグレーションする方法について説明します。

 


セキュリティのコンフィグレーションの概要

WebLogic Web サービスに対するセキュリティのコンフィグレーションは、基本的には、WebLogic Server で実行される他のタイプのアプリケーションやコンポーネントに対するセキュリティのコンフィグレーションと同じです。Web サービス全体に対するセキュリティは、Web サービスおよび WSDL を呼び出す URL へのアクセスを制限することにより設定できます。Web サービス全体でセキュリティを設定すると、その Web サービスを構成するコンポーネントも自動的にセキュリティが設定されます。また、ステートレス セッション EJB、一部のメソッド、web-services.xml ファイルが入った Web アプリケーションなど、Web サービスの個々のコンポーネントに対してセキュリティを設定することもできます。

Web サービスまたはそのコンポーネントへのアクセスが保護されたら、その Web サービスを呼び出すときに HTTP または SSL を使用してそれ自身を認証するようにクライアント アプリケーションをコンフィグレーションします。

WebLogic Web サービスのセキュリティのさらなる例については、「Webservice Download Page」を参照してください。

 


セキュリティのコンフィグレーション : 主な手順

WebLogic Web サービスおよび、サービスを呼び出すクライアントのセキュリティをコンフィグレーションするには、次の手順に従います。この手順の詳しい説明は後の節で行います。

  1. ロールを作成し、それらを自分のレルムのプリンシパルにマップして、次に、ロール内のプリンシパルのみがアクセスできる、安全なコンポーネントがどれであるかを指定することにより、Web サービスまたはその一部のコンポーネントへのアクセスをコントロールします。

    WebLogic Web サービスへのアクセスのコントロールを参照してください。

  2. 必要であれば、web-services.xml ファイルを更新して、Web サービスが HTTPS のみによりアクセスできるように指定します。

    HTTPS プロトコルの指定を参照してください。

  3. クライアント アプリケーションが SSL を使用して認証される場合は、WebLogic Server に対して SSL をコンフィグレーションします。

    WebLogic Server がクライアント アプリケーションに対して証明の提示を要求される場合には一方向 SSL、またクライアント アプリケーションと WebLogic Server の双方が互いに証明書を提示する場合には、双方向 SSL をコンフィグレーションします。

    SSL の詳細、一方向と双方向の違い、および両者をコンフィグレーションするための手順については、「SSL のコンフィグレーション」を参照してください。

    警告: WebLogic Web サービスを呼び出す際の接続のセキュリティを双方向 SSL を使用して設定する場合、WebLogic Server は常に証明書の ID をアサートすることで、有効なユーザにマップされるようにします。これは、Web サービスまたはステートレス EJB のバックエンド コンポーネントが特別な権限を必要としない場合も同様です。一方向 SSL の場合は、クライアント アプリケーションが証明書を送信しないため上記は適用されません。

  4. WebLogic Web サービスの呼び出し時に、HTTP または SSL を使用して認証されるように、クライアントをコーディングします。

    セキュリティが設定された Web サービスを呼び出すためのクライアント アプリケーションのコーディングを参照してください。

  5. クライアント アプリケーションが SSL を使用する場合は、クライアント サイドで SSL をコンフィグレーションします。

    クライアント アプリケーションに対する SSL のコンフィグレーションを参照してください。

 


WebLogic Web サービスへのアクセスのコントロール

前述のように、WebLogic Web サービスは、標準 J2EE エンタープライズ アプリケーションとしてパッケージ化されます。したがって、Web サービスへのアクセスにセキュリティを設定するには、Web サービスを構成する以下の標準 J2EE コンポーネントのいくつかまたはすべてに対するアクセスにセキュリティを設定する必要があります。

ベーシック HTTP 認証または SSL を使用して、WebLogic Web サービスにアクセスするクライアントを認証できます。先のコンポーネントが標準の J2EE コンポーネントであるため、標準の J2EE セキュリティ プロシージャを使用してセキュリティを設定します。

注意: Web サービスを実装するバックエンド コンポーネントが Java クラスまたは JMS リスナである場合は、次の節で説明するとおり、その Web サービスに対しては、Web サービスを呼び出す URL へのセキュリティ制約の追加によるほかは、セキュリティを設定できません。

WebLogic のセキュリティのコンフィグレーション、プログラミング、および管理の詳細については、セキュリティに関するドキュメントを参照してください。

Web サービスの URL に対してセキュリティを設定する

WebLogic Web サービスのホーム ページおよび WSDL の URLで説明するとおり、クライアント アプリケーションは、URL を使用して Web サービスにアクセスします。以下は、このような URL の例です。

http://ariel:7001/web_services/TraderService

URL へのアクセスを制限することにより、Web サービス全体へのアクセスを制限できます。そのためには、web.xml および weblogic.xml の両デプロイメント記述子ファイル (web-services.xml ファイルが格納されている Web アプリケーションにあります) をセキュリティ情報で更新します。

URL のアクセス制限の詳細については、「WebLogic リソースの保護」を参照してください。

ステートレス セッション EJB とそのメソッドに対してセキュリティを設定する

Web サービスを実装するステートレス セッション EJB に対してセキュリティを設定する場合は、そのサービスを呼び出すクライアント アプリケーションは、Web アプリケーション、WSDL および Web サービスのホーム ページにはアクセスできますが、オペレーションを実装するメソッドそのものを呼び出すことができない場合があります。このタイプのセキュリティは、EJB のビジネス ロジックに誰がアクセスしたかを細かくモニタするが、Web サービス全体へのアクセスはブロックしないという場合に便利です。

また、このタイプのセキュリティは、メソッドレベルで、Web サービスのさまざまなオペレーションにアクセスする場合にも使用できます。たとえば、情報を表示するメソッドは任意のユーザによって呼び出せるが、一部のユーザのみが情報を更新できるように指定することができます。

Adminstration Console を使用して EJB および EJB の個々のメソッドにセキュリティを設定する方法については、『WebLogic リソースのセキュリティ』を参照してください。

WSDL および Web サービスのホーム ページに対してセキュリティを設定する

WSDL または WebLogic Web サービスのホーム ページへのアクセスを制限するには、サービスを記述する web-services.xml デプロイメント記述子を更新します。以下の手順に従ってください。

  1. 任意のエディタで web-services.xml ファイルを開きます。

    web-services.xml ファイルは、Web サービス EAR ファイルの Web アプリケーションの WEB-INF ディレクトリにあります。ファイルの格納場所の詳細については、Web サービス EAR ファイル パッケージを参照してください。

  2. WSDL へのアクセスを制限する場合は、Web サービスを記述する <web-service> 要素に exposeWSDL="False" 属性を追加します。 ホーム ページへのアクセスを制限するには、exposeHomepage="False" 属性を追加します。以下に、コード例の一部を抜粋します。
         <web-service
    name="stockquotes"
    uri="/myStockQuoteService"
    exposeWSDL="False"
    exposeHomePage="False"
    >
    ...
    </web-service>

  3. 変更を有効にするために、Web サービスを再デプロイします。すべてのユーザが、WSDL および Web サービスのホーム ページにアクセスできなくなります。

 


HTTPS プロトコルの指定

Web サービスを HTTPS によってのみアクセスできるようにするには、次の例に示すように、その Web サービスを記述する web-services.xml ファイルにある <web-service> 要素の protocol 属性を更新します。

<web-services>
<web-service name="stockquotes"
targetNamespace="http://example.com"
uri="/myStockQuoteService"
protocol="https" >
...
</web-service>
</web-services>

注意: WebLogic Server に対して SSL のコンフィグレーションは行うが、web-services.xml ファイルで HTTPS プロトコルを指定しない場合は、クライアント アプリケーションから HTTP および HTTPS を使用して Web サービスにアクセスすることができます。ただし、web-services.xml ファイルで HTTPS アクセスを指定した場合、クライアント アプリケーションは HTTP では Web サービスにアクセスできません。

servicegen Ant タスクを使用して Web サービスをアセンブルする場合は、次の build.xml ファイルのサンプルに示すように、<service> 要素の protocol 属性を使用して HTTPS プロトコルを指定してください。

<project name="buildWebservice" default="ear">
<target name="ear">
<servicegen
destEar="ws_basic_statelessSession.ear"
contextURI="WebServices"
<service
ejbJar="HelloWorldEJB.jar"
targetNamespace="http://www.bea.com/webservices/basic/statelesSession"
serviceName="HelloWorldEJB"
serviceURI="/HelloWorldEJB"
protocol="https"
generateTypes="True"
expandMethods="True">
</service>
</servicegen>
</target>
</project>

 


セキュリティが設定された Web サービスを呼び出すためのクライアント アプリケーションのコーディング

Web サービスを呼び出す JAX-RPC クライアント アプリケーションを記述する際、クライアントの認証ができるように、サービスにユーザ名とパスワードを送信するための次の 2 つのプロパティを使用します。

次の例は JAX-RPC 仕様からの抜粋ですが、javax.xml.rpc.Stub インタフェースを使用して Web サービスを呼び出す場合の、これらのプロパティの使用法を示しています。

StockQuoteProviderStub sqp = // ...スタブを取得 ;
sqp._setProperty ("javax.xml.rpc.security.auth.username", "juliet");
sqp._setProperty ("javax.xml.rpc.security.auth.password", "mypassword");
float quote sqp.getLastTradePrice("BEAS");

WebLogic で生成したクライアント JAR ファイルを使用して Web サービスを呼び出す場合は、Stub クラスがすでに作成されているため、JAX-RPC 仕様から抜粋した次の例に示すように、getServicePort() メソッドのサービス固有の実装にユーザ名とパスワードを渡すことができます。

StockQuoteService sqs = // ...サービスへのアクセスを取得 ;
StockQuoteProvider sqp = sqs.getStockQuoteProviderPort ("juliet", "mypassword");
float quote = sqp.getLastTradePrice ("BEAS");

この例では、getStockQuoteProvidePort() メソッドの実装が、上記 2 つの認証プロパティを設定します。

JAX-RPC を使用してセキュリティが設定された Web サービスを呼び出すクライアント アプリケーションの記述に関する詳細は、http://java.sun.com/xml/jaxrpc/index.html を参照してください。

 


クライアント アプリケーションに対する SSL のコンフィグレーション

クライアント アプリケーションの SSL は、以下のいずれかを使用してコンフィグレーションします。

双方向 SSL を使用している場合、クライアント アプリケーションも、WebLogic Server に対して証明書を提示する必要があります。 詳細については、クライアント アプリケーションに対する双方向 SSL のコンフィグレーションを参照してください。

この節で説明した API の詳細は、Web サービスのセキュリティに関する Javadocs を参照してください。

WebLogic Server が提供する SSL 実装を使用する

WebLogic Server は、webserviceclient+ssl.jar クライアント実行時 JAR ファイルで SSL の実装を提供しています。このクライアント JAR ファイルには、SSL 実装のほか、webservicesclient.jar にある、標準のクライアント JAX-PRC 実行時クラスも入っています。

注意: クライアント機能に関する現在の BEA のライセンス供与については、Web サイト BEA eLicense を参照してください。

クライアント アプリケーションに対して基本的な SSL サポートをコンフィグレーションするには、次の手順に従います。

  1. WL_HOME¥server¥lib¥webserviceclient+ssl.jar ファイルを、クライアント アプリケーション開発用のコンピュータにコピーします。WL_HOME は、WebLogic プラットフォームの最上位ディレクトリです。このクライアント JAR ファイルには、SSL 実装および JAX-RPC のクライアント実行時実装が入っています。

  2. クライアント JAR ファイルをクライアント アプリケーションの CLASSPATH 変数に追加します。

  3. 信頼性のある CA (Certificate Authority : 認証局) 証明書のファイル名を設定します。その方法は次のいずれかです。

  4. クライアントアプリケーションを実行する際、コマンド ラインで次の System プロパティを設定します。
java -Dbea.home=c:¥bea_home ¥
-Djava.protocol.handler.pkgs=com.certicom.net.ssl my_app

注意: クライアント アプリケーションが、WebLogic Server のホストであるコンピュータとは異なるコンピュータ上で実行されている場合 (これが一般的) は、BEA ライセンス ファイルをサーバ コンピュータからクライアント コンピュータ上のディレクトリにコピーし、次に bea.home システム プロパティをこのクライアントサイドのディレクトリに指定します。

  • 厳密な証明書検証を無効にするには、アプリケーション実行時にコマンド ラインで weblogic.webservice.client.ssl.strictcertchecking System プロパティを false に設定するか、プログラムで BaseWLSSLAdapter.setStrictCheckingDefault() メソッドを使用します。
  • 詳細は、Web サービスのセキュリティに関する Javadocs を参照してください。

    SSL をプログラムでコンフィグレーションする

    WebLogic Server が提供する SSL 実装を、weblogic.webservice.client.WLSSLAdapter アダプタ クラスを使用してプログラムでコンフィグレーションすることもできます。このアダプタ クラスには、WebLogic Server の SSL 実装固有のコンフィグレーション情報が保持されていて、コンフィグレーションの参照と変更を可能にします。

    次の抜粋は、ある WebLogic Web サービスに対する WLSSLAdapter クラスのコンフィグレーションの例です。太字の行については、例の後で説明します。

        //アダプタのインスタンス化
    WLSSLAdapter adapter = new WLSSLAdapter();
    adapter.setTrustedCertifcatesFile("mytrustedcerts.pem");
        //任意に、アダプタ ファクトリが
    //常にこのインスタンスを使用するように設定
    SSLAdapterFactory.getDefaultFactory().setDefaultAdapter(adapter);
    SSLAdapterFactory.getDefaultFactory().setUseDefaultAdapter(true);
        //サービス ファクトリを作成
    ServiceFactory factory = ServiceFactory.newInstance();
        //サービスを作成
    Service service = factory.createService( serviceName );
        //呼び出しを作成
    Call call = service.createCall();
        call.setProperty("weblogic.webservice.client.ssladapter",
    adapter);
        try {
          //リモートの Web サービスを呼び出し
    String result = (String) call.invoke( new Object[ ]{ "BEAS" } );
    System.out.println( "Result: " +result);
    } catch (JAXRPCException jre) {
    ...
    }

    この例では、まず、WebLogic Server が提供する WLSSLAdapter クラスをインスタンス化する方法を示しています。webserviceclient+ssl.jar ファイルにある SSL 実装をサポートするクラスです。次に、setTrustedCertificatesFile(String) メソッドを使用して認証局証明書が入ったファイルの名前を選択して、アダプタ インスタンスをコンフィグレーションしています。この例では、ファイルの名前は mytrustedcerts.pem です。

    次に、アダプタ ファクトリのデフォルトのアダプタとして WLSSLAdapter を設定する方法を示し、ファクトリが必ずこのデフォルト値を返すようにコンフィグレーションしています。

    注意: これは任意の手順で、すべての Web サービスとそれぞれに対応するコンフィグレーションが、同じアダプタ クラスを共有できるようにします。

    また、Web サービスの特定のポートや呼び出しに対してこのアダプタを設定することもできます。先の例では、このアダプタを設定し、Call クラスを使用して Web サービスを動的に呼び出す方法を示しています。

    call.setProperty("weblogic.webservice.client.ssladapter", adapter);

    weblogic.webservice.client.SSLAdapter インタフェース (この例では、WebLogic Server が提供する WLSSLAdapter クラス) を実装するオブジェクトにこのプロパティを設定してください。

    次の例では、アダプタを設定し、Stub インタフェースを使用して Web サービスを静的に呼び出す方法を示しています。

    ((javax.xml.rpc.Stub)stubClass)._setProperty("weblogic.webservice.client.ssladapter", adapterInstance);

    次のメソッドを使用することにより、Web サービスの呼び出しまたはポートの特定のインスタンスに対するアダプタを取得して、Web サービスを動的に呼び出せます。

    call.getProperty("weblogic.webservice.client.ssladapter");

    Web サービスを静的に呼び出すには、次のメソッドを使用します。

    ((javax.xml.rpc.Stub)stubClass)._getProperty("weblogic.webservice.client.ssladapter");

    詳細は、Web サービスのセキュリティに関する Javadocs を参照してください。

    サードパーティの SSL 実装を使用する

    サードパーティの SSL 実装を使用する場合は、まず独自のアダプタ クラスを実装する必要があります。次の例は、JSSE のサポートを提供する簡単なクラスを示しています。自分でクラスを実装する主な手順は、例の後で説明します。

    import java.net.URL;
    import java.net.Socket;
    import java.net.URLConnection;
    import java.io.IOException;
    public class JSSEAdapter implements weblogic.webservice.client.SSLAdapter {
      javax.net.SocketFactory factory =
    javax.net.ssl.SSLSocketFactory.getDefault();
      //weblogic.webservice.client.SSLAdapter インタフェースを実装
      public Socket createSocket(String host, int port) throws IOException  {
    return factory.createSocket(host, port);
    }
      public URLConnection openConnection(URL url) throws IOException {
    //java.protocol.handler.pkgs が正しく設定されていることを前提とする
    return url.openConnection();
    }
      //コンフィグレーション インタフェース
      public void setSocketFactory(javax.net.ssl.SSLSocketFactory factory) {
    this.factory = factory;
    }
      public javax.net.ssl.SSLSocketFactory getSocketFactory() {
    return (javax.net.ssl.SSLSocketFactory) factory;
    }
    }

    自分でアダプタ クラスを作成するには、次の手順に従います。

    1. 次のインタフェースを実装するクラスを作成します。
      weblogic.webservice.client.SSLAdapter

    2. 次のシグネチャを持つ createSocket メソッドを実装します。
      public Socket createSocket(String host, int port)
      throws IOException

      このメソッドは、java.net.Socket を拡張するオブジェクトを返します。このオブジェクトは、Web サービスが呼び出されると、指定されたホスト名とポートに接続されます。

    3. 次のシグネチャを持つ openConnection メソッドを実装します。
      public URLConnection openConnection(URL url) throws IOException

      このメソッドは、java.net.URLConnection を拡張するオブジェクトを返します。このオブジェクトは、指定された URL に接続されるようにコンフィグレーションされます。これらの接続は、Web サービスの WSDL のダウンロードなど、使用頻度の低いネットワーク オペレーションに使用されます。

    4. クライアント アプリケーションの実行時に、次の System プロパティを、作成したアダプタ クラスの完全修飾名に設定します。
      weblogic.webservice.client.ssl.adapterclass

      デフォルトの SSLAdapterFactory クラスは、作成したアダプタ クラスをロードし、デフォルトの引数を持たないコンストラクタを使用してそのクラスのインスタンスを作成します。

    5. SSL をプログラムでコンフィグレーションするで示したようにカスタム アダプタをコンフィグレーションし、WLSSLAdapter を自分のクラスに置き換えて、アダプタに定義されたコンフィグレーション方法を使用します。

    詳細は、Web サービスのセキュリティに関する Javadocs を参照してください。

    SSLAdapterFactory クラスを拡張する

    SSLAdapterFactory クラスを拡張することによって、カスタムの SSL アダプタのファクトリ クラス (アダプタのインスタンスを作成するために使用) を作成することができます。ファクトリ クラスを拡張する理由の 1 つは、それにより、各アダプタの使用に先立ち、作成時に、カスタムのコンフィグレーションを実行できるようになることです。

    カスタムの SSL アダプタのファクトリ クラスを作成するには、次の手順に従います。

    1. 次のクラスを拡張するクラスを作成します。
      weblogic.webservice.client.SSLAdapterFactory

    2. SSLAdapterFactory クラスの次のメソッドを書き換えます。
    public weblogic.webservice.client.SSLAdapter createSSLAdapter();

    アダプタ ファクトリによって、SSLAdapter またはこのインタフェースを実装するアダプタが新たに作成されたときは、必ず、このメソッドが呼び出されます。このメソッドを書き換えることによって、新しいアダプタを実際に使用し始める前にカスタムのコンフィグレーションを実行できます。

  • クライアント アプリケーションで、ファクトリのインスタンスを作成し、次のメソッドを実行して、そのファクトリをデフォルト ファクトリとして設定します。
  • SSLAdapterFactory.setDefaultFactory(factoryInstance);

    詳細は、Web サービスのセキュリティに関する Javadocs を参照してください。

    クライアント アプリケーションに対する双方向 SSL のコンフィグレーション

    WebLogic Server に対して双方向 SSL をコンフィグレーションした場合は、一方向 SSL で要求されるようにクライアント アプリケーションに対して WebLogic Server が証明書を提示するのに加えて、クライアント アプリケーションが WebLogic Server に証明書を提示することも必要です。 以下のサンプル Java コードでは、それを行うための方法の 1 つを示します。ここでは、クライアント アプリケーションがクライアント証明書ファイルを引数 (太字で示した該当コード) として受け取っています。

    ...
    SSLAdapterFactory factory = SSLAdapterFactory.getDefaultFactory();
    WLSSLAdapter adapter = (WLSSLAdapter) factory.getSSLAdapter();
    if (argv.length > 1 ) {
    System.out.println("loading client certs from "+argv[1]);
    FileInputStream clientCredentialFile  = new FileInputStream (argv[1]);
    String pwd = "clientkey";
    adapter.loadLocalIdentity(clientCredentialFile, pwd.toCharArray());
    javax.security.cert.X509Certificate[] certChain = adapter.getIdentity("RSA",0);
    factory.setDefaultAdapter(adapter);
    factory.setUseDefaultAdapter(true);
    ...

    WebLogic Web サービスでの双方向 SSL の完全な使用例については、「Two-Way SSL Example」を参照してください。

    プロキシ サーバを使用する

    たとえば、クライアント アプリケーションがファイアウォールの内側で動作している状況で、プロキシ サーバを使用する必要がある場合は、以下の 2 つの System プロパティを使用してプロキシ サーバのホスト名とポートを設定します。

    これらの System プロパティの詳細については、WebLogic Web サービスのシステム プロパティを参照してください。

     

    Back to Top Previous Next