ヘッダーをスキップ
Oracle Application Server Web Servicesセキュリティ・ガイド
10gリリース3(10.1.3)
B31870-01
  目次
目次
索引
索引

戻る
戻る
 
次へ
次へ
 

4 安全なWebサービスの構築

この章では安全なWebサービスを構築するための一般的な手順を説明します。Oracle Application Server Web Servicesには、サービスをトップ・ダウン(WSDLから)またはボトム・アップ(Javaクラス、EJB、データベース・リソースから)形式でアセンブルすることを可能にするWebServicesAssemblerツールが用意されています。このツールはビルド・スクリプトのAntタスクから、またはコマンドラインでコマンドを入力することでサービスをアセンブルできます。


関連資料:

Webサービスを構築するためのWebServicesAssemblerツールの使用の詳細は、『Oracle Application Server Web Services開発者ガイド』を参照してください。



注意:

Oracle JDeveloper IDEとApplication Server Controlツールを、安全なWebサービスの開発に利用できます。安全なWebサービスを構築、構成、デプロイおよびテストするにはOracle JDeveloper IDEを使用します。また、そのWebサービスをデプロイ、管理および監視するにはApplication Server Controlツールを使用します。これらのツールを使用したWebサービスの構築およびデプロイの詳細は、Oracle JDeveloperのオンライン・ヘルプでWebサービスの開発に関するトピックを、また、Application Server Controlのオンライン・ヘルプでWebサービス・ページに関するトピックを参照してください。

安全なWebサービスのアセンブル

OracleAS Web Servicesセキュリティでは、Webサービスに対するセキュリティ・ポリシーがXML構成ファイルで指定されます。指定されるセキュリティ・ポリシーの例としては、ユーザー名トークン認証や、SOAPメッセージ・ボディのXML署名および暗号化などがあります。

WebServicesAssemblerツールは、構成ファイルで宣言されたポリシーをアセンブル時にWebサービスへ追加します。ポリシーはボトム・アップ・アプローチまたはトップ・ダウン・アプローチのどちらかでサービスにアセンブルできます。ユーザーはサーバーに対して1つの構成ファイルを、またクライアントに対して対応するファイルを用意する必要があります。

次の項で、セキュリティのWebサービスへのアセンブル方法について説明します。

次の項では、サーバーおよびクライアントに対するファイルの作成方法について説明します。また、ユーザー名認証とXML署名および暗号化セキュリティ・ポリシーを実装するための、コンテンツの指定方法についても説明します。

トップ・ダウンによるセキュリティのWebサービスへのアセンブル

次の手順は、既存のWSDLからトップ・ダウンでアセンブル中のWebサービス・アプリケーションにセキュリティ構成を追加する場合の一般的なアウトラインを示しています。このアセンブリを実行するため、WebServicesAssemblerツールにはtopDownAssembleコマンドが用意されています。セキュリティの追加に関するステップのみを詳しく説明します。個々のステップの詳細が必要な場合は、『Oracle Application Server Web Services開発者ガイド』の「WSDLからのWebサービスのアセンブル」を参照してください。

  1. WebServicesAssemblerを使用してサービス・エンドポイント・インタフェースを生成します。

    Webサービスが生成される元となるWSDLをWebServicesAssemblerのgenInterfaceコマンドの入力として指定します。

  2. Javaコンパイラを使用して、ステップ1で生成されたインタフェースおよびタイプ・クラスをコンパイルします。

  3. 提供するWebサービスに対してJavaサービス・エンドポイントを実装します。

    Javaサービス・エンドポイントには、ステップ1で生成されたJavaインタフェースのすべてのメソッドと一致するメソッド・シグネチャが必要です。

  4. Javaサービス・エンドポイントをコンパイルします。

  5. サーバー側のセキュリティ構成ファイルを作成します。

    WebServicesAssemblerツールはこのファイルを使用して、セキュリティ情報をoracle-webservices.xmlのサーバー側デプロイメント・ディスクリプタに生成します。このファイルの作成手順については、「サーバー側セキュリティ構成ファイルの作成」を参照してください。

  6. (オプション)キーストアを作成します。

    データの署名または暗号化を行う場合、もしくは署名の検証やデータの復号化を行う場合は、信頼できる証明書と公開鍵および秘密鍵を格納するためのキーストアが必要です。Oracle WalletまたはJKSキーストアの作成の詳細は、「キーストアの作成」を参照してください。

  7. (オプション)キーストアをバンドルします。

    サーバー側セキュリティ構成で、インバウンド・ポリシーに<decrypt><verify-signature><verify-x509-token>または<verify-saml-token>要素が含まれる場合、あるいはアウトバウンド・ポリシーに<encrypt><x509-token><saml-token>または<signature>要素が含まれる場合は、アプリケーションにキーストアをバンドルするか、グローバル・レベル・キーストアを指定する必要があります。

    アプリケーションにキーストアをバンドルするには、次の手順に従います。

    1. サービスが生成される場所のディレクトリ(つまり、WebServicesAssembler topDownAssembleコマンドのoutput引数のターゲットとして指定されたディレクトリ)にear/META-INFディレクトリを作成します。

    2. ear/META-INFディレクトリにキーストアをコピーします。

  8. サービスをアセンブルします。

    WebServicesAssemblerのtopDownAssembleコマンドを使用してWebサービスをアセンブルします。これがWebサービスに対してセキュリティ構成を生成する場所となります。セキュリティ構成が含まれるserverConfig.xmlファイルへのパスが、ddFileName引数で指定されることに注意してください。

    コマンドライン:

    java -jar wsa.jar -topDownAssemble
                      -wsdl SecureService.wsdl
                      -unwrapParameters false
                      -className oracle.demo.security.SecureServiceImpl
                      -input build/classes/service
                      -output build
                      -ear dist/secure_service.ear
                      -packageName oracle.demo.security
                      -fetchWsdlImports true
                      -ddFileName serverConfig.xml
                      -classpath ./build/classes/client/ :
                          $OC4J_HOME/jlib/jaxen.jar :
                          $OC4J_HOME/jlib/osdt_wss.jar :
                          $OC4J_HOME/jlib/osdt_cert.jar :
                          $OC4J_HOME/jlib/osdt_xmlsec.jar :
                          $OC4J_HOME/jlib/osdt_core.jar :
                          $OC4J_HOME/jlib/osdt_saml.jar :
                          $OC4J_HOME/jlib/oraclepki.jar :
                          $OC4J_HOME/j2ee/home/jazn.jar :
                          $OC4J_HOME/j2ee/home/jazncore.jar :
                          $OC4J_HOME/j2ee/home/jaznplugin.jar
    
    

    Antタスク:

    <oracle:topDownAssemble appName="secure_service"
             wsdl="./wsdl/SecureService.wsdl"
             unwrapParameters="false"
             input="build/classes/service "
             output="build"
             ear="dist/secure_service.ear"
             packageName="oracle.demo.security"
             fetchWsdlImports="true"
             ddFileName=serverConfig.xml>
             <oracle:portType
                className="oracle.demo.topdowndoclit.service.DocLitLoggerImpl"
             </oracle:portType>
             <oracle:classpath>
                 <pathelement location="build/classes/client/" />
                 <pathelement location="${OC4J_HOME}/jlib/jaxen.jar" />
                 <pathelement location="${OC4J_HOME}/jlib/osdt_wss.jar" />
                 <pathelement location="${OC4J_HOME}/jlib/osdt_cert.jar" />
                 <pathelement location="${OC4J_HOME}/jlib/osdt_xmlsec.jar" />
                 <pathelement location="${OC4J_HOME}/jlib/osdt_core.jar" />
                 <pathelement location="${OC4J_HOME}/jlib/osdt_saml.jar" />
                 <pathelement location="${OC4J_HOME}/jlib/oraclepki.jar" />
                 <pathelement location="${OC4J_HOME}/j2ee/home/jazn.jar" />
                 <pathelement location="${OC4J_HOME}/j2ee/home/jazncore.jar" />
                 <pathelement location="${OC4J_HOME}/j2ee/home/jaznplugin.jar" />
           </oracle:classpath>
     </oracle:topDownAssemble>
    
    

    このコマンドおよびAntタスクの説明は次のとおりです。

    • topDownAssemble: WSDLの記述に基づき、Webサービスに必要なクラスとデプロイメント・ディスクリプタを作成します。このファイルはEARファイル、WARファイルまたはディレクトリに格納することができます。

    • wsdl: WSDLドキュメントの絶対ファイル・パス、相対ファイル・パスまたはURLを指定します。

    • unwrapParameters: falseに設定すると、生成されたサービス・エンドポイント・インタフェースは入力パラメータと戻り型の前後にラッパーを伴って生成されます。

    • className: Webサーバーの実装クラスのクラス名(パッケージ名を含む)を指定します。

    • input: WEB-INF/classesにコピーする必要のあるクラスを含むディレクトリまたはJARを指定します。この引数は、WebServicesAssemblerで使用されるクラスパスに追加されます。

    • output: 生成されたファイルが格納されるディレクトリを指定します。ディレクトリが存在しない場合は作成されます。

    • ear: 生成されたEARの名前と場所を指定します。

    • packageName: JAX-RPCマッピング・ファイルでパッケージ名が宣言されていない場合に、作成されるクラスに使用されるパッケージ名を指定します。

    • fetchWsdlImports: WSDLおよびWSDLによってインポートされるすべての内容のローカル・コピーを作成するかどうかを示します。

    • ddFileName: Webサービスを割り当てるかどうかについての設定を含むoracle-webservices.xmlデプロイメント・ディスクリプタを指定します。

    • classpath: WebServicesAssemblerに付与するユーザー作成クラスを含むクラスパスを指定します。この引数を指定する1つの理由は、値タイプのクラスまたは例外をすでに作成している場合、WebServicesAssemblerがこれらを上書きしないようにするためです。


    関連資料:

    これらの引数の詳細は、『Oracle Application Server Web Services開発者ガイド』の「WebServicesAssemblerの使用方法」を参照してください。


    最低でもWSDLの名前、(ステップ3で生成された)サービスを実装するクラス名、および出力ディレクトリの名前を指定します。WebServicesAssemblerツールはEARファイルと、EAR内のWARファイルを出力します。WARファイルにはサービス・アーチファクト、実装クラス、Webデプロイメント・ディスクリプタ(web.xml)およびJAX-RPCデプロイメント・ディスクリプタ(webservices.xml)、およびセキュリティ構成を保持するoracle-webservices.xmlが含まれます。


    注意:

    ユーザー名トークンに基づいてユーザーを認証する場合は、ユーザー・エントリがクライアントによって送信されたユーザー名およびパスワードとともに存在する必要があります。ユーザー・エントリのファイルベース・リポジトリの作成の詳細は、『Oracle Containers for J2EEセキュリティ・ガイド』を参照してください。

  9. OC4Jの実行中インスタンスに対してサービスをデプロイおよびバインドします。

    Application Server Control、またはコマンドラインでadmin_client.jarを使用することでサービスをデプロイできます。デプロイの詳細は、Application Server Controlのオンライン・ヘルプ内のアプリケーションのデプロイに関する項と、『Oracle Containers for J2EEデプロイメント・ガイド』を参照してください。

  10. クライアントによって送信されたユーザー・データを認証するように、サーバー側セキュリティ・プロバイダを構成します。

    セキュリティ・プロバイダの構成の詳細は、『Oracle Containers for J2EEセキュリティ・ガイド』を参照してください。

  11. (オプション)デプロイが成功したことを確認します。OracleAS Web Servicesでは、デプロイされた各Webサービスに対して「Webサービス: テスト」ページが用意されます。

    「Webサービス: テスト」ページの詳細は、『Oracle Application Server Web Services開発者ガイド』を参照してください。

  12. クライアントのセキュリティ構成ファイルを作成します。

    Webサービス・クライアントに適用されるセキュリティを指定する、クライアント構成ファイルを作成します。この例ではファイルはclientConfig.xmlと名付けられます。WebServicesAssemblerツールはこのファイルを使用して、クライアント側デプロイメント・ディスクリプタの<generated_name>_Stub.xmlを生成します。クライアント構成ファイルの作成手順については、「クライアント側セキュリティ構成ファイルの作成」を参照してください。

  13. 安全なクライアント・コードを生成します。

    J2SE環境について、WebServicesAssemblerツールをgenProxyコマンドで実行して、J2SE Webサービス・クライアントに対するスタブ(クライアント・プロキシ)を生成します。

    J2EEクライアントのアセンブルの詳細は、『Oracle Application Server Web Services開発者ガイド』のJ2EEクライアントのアセンブルに関する項を参照してください。

    たとえば、次のコマンドはJ2SEクライアントについて使用可能なクライアント・プロキシを生成します。ddFileName引数がクライアント構成ファイルを指定することに注意してください。

    コマンドライン:

    java -jar wsa.jar -genProxy
    -wsdl http://localhost:8888/webservice/webservice?WSDL
    -unwrapParameters false
    -output build/src/client
    -packageName oracle.demo.security.stubs
    -ddFileName clientConfig.xml
    
    

    Antタスク:

    <oracle:genProxy
    wsdl="http://localhost:8888/webservice/webservice?WSDL"
    unwrapParameters="false"
    output="build/src/client"
    packageName="oracle.demo.security.stubs"
    ddFileName="clientConfig.xml"
    />
    
    

    このコマンドおよびAntタスクの説明は次のとおりです。

    • genProxy: J2SE Webサービス・クライアントに使用される静的プロキシ・スタブを作成します。

    • wsdl: WSDLドキュメントの絶対ファイル・パス、相対ファイル・パスまたはURLを指定します。

    • unwrapParameters: この引数は、ドキュメントリテラル操作のみに設定され、その他のメッセージ書式では無視されます。falseに設定すると、生成されたサービス・エンドポイント・インタフェースは入力パラメータと戻り型の前後にラッパーを伴って生成されます。

    • output: 生成されたファイルが格納されるディレクトリを指定します。ディレクトリが存在しない場合は作成されます。

    • packageName: JAX-RPCマッピング・ファイルでパッケージ名が宣言されていない場合に、作成されるクラスに使用されるパッケージ名を指定します。

    • ddFileName: Webサービスを割り当てるかどうかについての設定を含むoracle-webservices.xmlデプロイメント・ディスクリプタを指定します。


    関連資料:

    これらの引数の詳細は、『Oracle Application Server Web Services開発者ガイド』の「WebServicesAssemblerの使用方法」を参照してください。


    最低でもWSDLの名前、出力ディレクトリの名前、およびクライアント構成ファイルの名前を指定します。WebServicesAssemblerツールは<generated_name>_Stub.xmlを生成します。クライアント・アプリケーションはこのスタブを使用して、リモート・サービス上の操作を起動します。

  14. クライアントをコンパイルして実行します。

ボトム・アップによるセキュリティのWebサービスへのアセンブル

次の手順は、ボトム・アップでアセンブル中のWebサービス・アプリケーションにセキュリティ構成を追加する場合の一般的なアウトラインを示しています。WebServicesAssemblerツールは、サービスをJavaクラス、EJB、JMS宛先またはデータベース・リソースからアセンブルするかどうかに基づいて様々な特定コマンドを提供します。これらのコマンドの概要は「AntタスクとWebServicesAssembler」にあります。

次の例では、WebサービスがJavaクラスからアセンブルされます。このアセンブリを実行するため、WebServicesAssemblerツールにはassembleコマンドが用意されています。セキュリティの追加に関するステップのみを詳しく説明します。個々のステップの詳細が必要な場合は、『Oracle Application Server Web Services開発者ガイド』の「Javaクラスを使用したWebサービスのアセンブル」を参照してください。

  1. Webサービスとして公開する対象のコンパイル済Javaクラスと、そのコンパイル済インタフェースを提供します。

  2. Webサービスのセキュリティ構成ファイルを作成します。

    この例ではファイルはserverConfig.xmlと名付けられます。WebServicesAssemblerツールはこのファイルを使用して、セキュリティ情報をoracle-webservices.xmlのサーバー側デプロイメント・ディスクリプタに生成します。このファイルの作成手順については、「サーバー側セキュリティ構成ファイルの作成」を参照してください。

  3. (オプション)キーストアを作成します。

    データの署名または暗号化を行う場合、もしくは署名の検証やデータの復号化を行う場合は、信頼できる証明書と公開鍵および秘密鍵を格納するためのキーストアが必要です。Oracle WalletまたはJKSキーストアの作成の詳細は、「キーストアの作成」を参照してください。

  4. (オプション)キーストアをバンドルします。

    サーバー側セキュリティ構成で、インバウンド・ポリシーに<decrypt><verify-signature><verify-x509-token>または<verify-saml-token>要素が含まれる場合、あるいはアウトバウンド・ポリシーに<encrypt><x509-token><saml-token>または<signature>要素が含まれる場合は、アプリケーションにキーストアをバンドルするか、グローバル・レベル・キーストアを指定する必要があります。

    アプリケーションにキーストアをバンドルするには、次の手順に従います。

    1. サービスが生成される場所のディレクトリ(つまり、WebServicesAssemblerのoutput引数のターゲットとして指定されたディレクトリ)にear/META-INFディレクトリを作成します。

    2. ear/META-INFディレクトリにキーストアをコピーします。

  5. 安全なWebサービスをアセンブルします。

    作成中のWebサービスに対する適切な*AssembleコマンドでWebServicesAssemblerツールを実行して、Webサービスをアセンブルします。serverConfig.xmlサーバー構成ファイルへのパスが、ddFileName引数で指定されることに注意してください。

    この例では、コマンドがUNIXオペレーティング・システムで実行されることが前提なので注意してください。ディレクトリ・パスはフォワード・スラッシュ(/)を使用し、クラスパス引数は個々のクラスパス要素を区切るためコロン(:)を使用します。Windowsオペレーティング・システムを使用する場合は、ディレクトリ・パスでは円記号(\)を使用し、セミコロン(;)で個々のクラスパス要素を区切ります。

    コマンドライン:

    java -jar wsa.jar -assemble
              -appName securehello
              -serviceName SecureHelloService
              -interfaceName oracle.demo.hello.HelloInterface
              -className oracle.demo.hello.HelloImpl
              -input ./build/classes/client
              -output build
              -ear dist/securehello.ear
              -uri SecureHelloService
              -ddFileName serverConfig.xml
              -classpath ./build/classes/client/ :
                          $OC4J_HOME/jlib/jaxen.jar :
                          $OC4J_HOME/jlib/osdt_wss.jar :
                          $OC4J_HOME/jlib/osdt_cert.jar :
                          $OC4J_HOME/jlib/osdt_xmlsec.jar :
                          $OC4J_HOME/jlib/osdt_core.jar :
                          $OC4J_HOME/jlib/osdt_saml.jar :
                          $OC4J_HOME/jlib/oraclepki.jar :
                          $OC4J_HOME/j2ee/home/jazn.jar :
                          $OC4J_HOME/j2ee/home/jazncore.jar :
                          $OC4J_HOME/j2ee/home/jaznplugin.jar
    
    

    Antタスク:

    <oracle:assemble appName="securehello"
            serviceName'"SecureHelloService"
            input="./build/classes/client"
            output="build"
            ear="dist/securehello.ear"
            >
             <oracle:porttype
               interfaceName="oracle.demo.hello.HelloInterface"
               className="oracle.demo.hello.HelloImpl"
               <oracle:port uri="SecureHelloService" />
             </oracle:porttype>
             <oracle:classpath>
                 <pathelement location="build/classes/client/" />
                 <pathelement location="${OC4J_HOME}/jlib/jaxen.jar" />
                 <pathelement location="${OC4J_HOME}/jlib/osdt_wss.jar" />
                 <pathelement location="${OC4J_HOME}/jlib/osdt_cert.jar" />
                 <pathelement location="${OC4J_HOME}/jlib/osdt_xmlsec.jar" />
                 <pathelement location="${OC4J_HOME}/jlib/osdt_core.jar" />
                 <pathelement location="${OC4J_HOME}/jlib/osdt_saml.jar" />
                 <pathelement location="${OC4J_HOME}/jlib/oraclepki.jar" />
                 <pathelement location="${OC4J_HOME}/j2ee/home/jazn.jar" />
                 <pathelement location="${OC4J_HOME}/j2ee/home/jazncore.jar" />
                 <pathelement location="${OC4J_HOME}/j2ee/home/jaznplugin.jar" />
             </oracle:classpath>
    </oracle:assemble>
    
    

    このコマンドおよびAntタスクの説明は次のとおりです。

    • assemble: Javaファイルからボトム・アップでWebサービスを生成します。このコマンドは、デプロイ可能なアーカイブの作成に必要なすべてのファイルを作成します。

    • appName: アプリケーション名を指定します。通常この名前は、contexturiなどの他の引数のベース値として使用されます。

    • serviceName: サービス名を指定します。

    • interfaceName: サービス・エンドポイント・インタフェース(SEI)を含むJavaクラス名(パッケージ名を含む)を指定します。

    • className: Webサーバーの実装クラスのクラス名(パッケージ名を含む)を指定します。

    • input: WEB-INF/classesにコピーする必要のあるクラスを含むディレクトリまたはJARを指定します。この引数は、WebServicesAssemblerで使用されるクラスパスに追加されます。

    • output: 生成されたファイルが格納されるディレクトリを指定します。ディレクトリが存在しない場合は作成されます。

    • ear: 生成されたEARの名前と場所を指定します。

    • uri: Webサービスに使用するURIを指定します。

    • ddFileName: Webサービスを割り当てるかどうかについての設定を含むoracle-webservices.xmlデプロイメント・ディスクリプタを指定します。

    • classpath: WebServicesAssemblerに付与するユーザー作成クラスを含むクラスパスを指定します。この引数を指定する1つの理由は、値タイプのクラスまたは例外をすでに作成している場合、WebServicesAssemblerがこれらを上書きしないようにするためです。


    関連資料:

    これらの引数の詳細は、『Oracle Application Server Web Services開発者ガイド』の「WebServicesAssemblerの使用方法」を参照してください。


    このコマンドの出力は、OC4Jインスタンスにデプロイ可能なWARファイルのコンテンツを含むEARファイルです。output引数で指定されるbuildディレクトリには、EARファイルおよびJavaクラスに対する別々のディレクトリが含まれます。distディレクトリには、J2EE Webサービス準拠アプリケーションのEARファイル、securehello.earが含まれます。


    注意:

    ユーザー名トークンに基づいてユーザーを認証する場合は、ユーザー・エントリがクライアントによって送信されたユーザー名およびパスワードとともに存在する必要があります。サーバーに対するユーザー・エントリの追加の詳細は、『Oracle Containers for J2EEセキュリティ・ガイド』のファイル・ベース・プロバイダの構成に関する項を参照してください。

  6. サービスをデプロイしてバインドします。

    Application Server Control、またはコマンドラインでadmin_client.jarを使用することでサービスをデプロイできます。デプロイの詳細は、Application Server Controlのオンライン・ヘルプ内のアプリケーションのデプロイに関する項と、『Oracle Containers for J2EEデプロイメント・ガイド』を参照してください。

  7. クライアントによって送信されたユーザー・データを認証するように、サーバー側セキュリティ・プロバイダを構成します。

    セキュリティ・プロバイダ構成の詳細は、『Oracle Containers for J2EEセキュリティ・ガイド』を参照してください。

  8. (オプション)デプロイが成功したことを確認します。OracleAS Web Servicesでは、デプロイされた各Webサービスに対して「Webサービス: ホーム」ページが用意されます。

    「Webサービス: ホーム」ページの詳細は、『Oracle Application Server Web Services開発者ガイド』の「Webサービス・デプロイのテスト」を参照してください。

  9. クライアントのセキュリティ構成を作成します。

    Webサービス・クライアントに適用されるセキュリティを指定する、クライアント構成ファイルを作成します。この例ではファイルはclientConfig.xmlと名付けられます。WebServicesAssemblerツールはこのファイルを使用して、クライアント側デプロイメント・ディスクリプタの<generated_name>_Stub.xmlを生成します。クライアント構成ファイルの作成手順については、「クライアント側セキュリティ構成ファイルの作成」を参照してください。

  10. 安全なクライアント・コードをアセンブルします。

    J2SE環境について、WebServicesAssemblerツールをgenProxyコマンドで実行して、J2SE Webサービス・クライアントに対するスタブ(クライアント・プロキシ)を生成します。

    J2EEクライアントのアセンブルの詳細は、『Oracle Application Server Web Services開発者ガイド』のJ2EEクライアントのアセンブルに関する項を参照してください。

    たとえば、次のコマンドはJ2SEクライアントについて使用可能なクライアント・プロキシを生成します。ddFileName引数がクライアント構成ファイルを指定することに注意してください。

    コマンドライン:

    java -jar wsa.jar -genProxy
    -wsdl http://localhost:8888/webservice/webservice?WSDL
    -unwrapParameters false
    -output build/src/client
    -packageName oracle.demo.security.stubs
    -ddFileName clientConfig.xml
    
    

    Antタスク:

    <oracle:genProxy
    wsdl="http://localhost:8888/webservice/webservice?WSDL"
    unwrapParameters="false"
    output="build/src/client"
    packageName="oracle.demo.security.stubs"
    ddFileName="clientConfig.xml"
    />
    
    

    このコマンドおよびAntタスクの説明は次のとおりです。

    • genProxy: J2SE Webサービス・クライアントに使用される静的プロキシ・スタブを作成します。

    • wsdl: WSDLドキュメントの絶対ファイル・パス、相対ファイル・パスまたはURLを指定します。

    • unwrapParameters: この引数は、ドキュメントリテラル操作のみに設定され、その他のメッセージ書式では無視されます。falseに設定すると、生成されたサービス・エンドポイント・インタフェースは入力パラメータと戻り型の前後にラッパーを伴って生成されます。

    • output: 生成されたファイルが格納されるディレクトリを指定します。ディレクトリが存在しない場合は作成されます。

    • packageName: JAX-RPCマッピング・ファイルでパッケージ名が宣言されていない場合に、作成されるクラスに使用されるパッケージ名を指定します。

    • ddFileName: Webサービスを割り当てるかどうかについての設定を含むoracle-webservices.xmlデプロイメント・ディスクリプタを指定します。


    関連資料:

    これらの引数の詳細は、『Oracle Application Server Web Services開発者ガイド』の「WebServicesAssemblerの使用方法」を参照してください。


    最低でもWSDLの名前、出力ディレクトリの名前、およびクライアント構成ファイルを指定します。WebServicesAssemblerツールは<generated_name>_Stub.xmlを生成します。クライアント・アプリケーションはこのスタブを使用して、リモート・サービス上の操作を起動します。

  11. クライアントをコンパイルして実行します。

サーバー側セキュリティ構成ファイルの作成

この項では、ユーザー名トークンを検証するための、サーバー側Webサービス・セキュリティ構成ファイルの作成方法を説明します。この例ではファイルはserverConfig.xmlと名付けられます。WebServicesAssemblerツールはこのファイルで見つかったデータを、oracle-webservices.xmlのサーバー側デプロイメント・ディスクリプタに付加します。


注意:

Oracle JDeveloperを使用してWebサービスを保護する場合、セキュリティ構成はoracle-webservices.xmlファイルに対して自動的に生成されます。

次に、サーバー側Webサービス・セキュリティ構成ファイルの一般的な作成手順を示します。

  1. テキスト・エディタを使用してファイルを作成します。

    例4-1serverConfig.xmlというサーバー側構成ファイルの例を示します。

  2. XML要素を入力して、ファイルのセキュリティ構成を設定します。

    次の項では、ユーザー名トークンとXML署名および暗号に対するサーバー側Webサービス・セキュリティ構成の例を説明します。

  3. ファイルを保存します。

ユーザー名トークンに対するサーバー側ポート・レベル・セキュリティ構成の定義

例4-1 に、ポート・レベルでセキュリティを実施するサーバー側Webサービス構成ファイルの例を示します。これは、ポートのあらゆる操作に対してアクセスが付与される前に、ユーザー名トークンが検証されることを意味します。行番号は参照目的で付加されているだけなので注意してください。この番号は実際のファイルには表示されません。インバウンド・セキュリティに対する<verify-username-token>要素の詳細は、「インバウンド・メッセージに対するセキュリティ要素」を参照してください。

  • 行番号2: この行はセキュリティが適用される対象のWebサービスを指定します。name属性の値はWSDLのサービス名と一致します。

  • 行番号3: この行はポート名を指定します。これはWSDLの有効なポート名と一致する必要があります。

  • 行番号4〜10: この例ではセキュリティがポート・レベルで適用されます。<runtime enabled="security">要素は実行時に、Webサービス・セキュリティが<security>要素で定義されたポリシーに基づいて実施されることを示しています。この例ではセキュリティがポート・レベルで構成されるため、このWebサービスで公開されるすべての操作に対して同じセキュリティが適用されます。

  • 行番号6〜8: これらの行は受信リクエストに対するインバウンド・セキュリティを構成します。この例で<verify-username-token/>要素は、Webサービス・アプリケーションがリクエスト・ヘッダーにユーザー名トークンを要求することを示しています。パスワード・タイプや、Nonceの有無を要求することもできます。この要素の詳細は、「インバウンド・メッセージに対するセキュリティ要素」を参照してください。

  • 行番号11〜13: これらの行はWebサービス・ポートが公開する対象の操作を定義します。

例4-1 ポート・レベルのユーザー名トークン検証に対するサーバー側構成ファイルの例

1. <oracle-webservices>
2.   <webservice-description name="SecureService">
3.       <port-component name="SecureServiceSoap">
4.       <runtime enabled="security">
5.       <security>
6.          <inbound>
7.           <verify-username-token/>
8.          </inbound>
9.       </security>
10.      </runtime>
11.      <operations>
12.        <operation name="getCatalog"/>
13.      </operations>
14.      </port-component>
15.   </webservice-description>
16. </oracle-webservices>

ユーザー名トークンに対するサーバー側操作レベル・セキュリティ構成の定義

例4-2 に、操作レベルでセキュリティを実施するサーバー側Webサービス構成ファイルの例を示します。これは、指定された操作に対してアクセスが付与される前に、ユーザー名トークンが検証されることを意味します。行番号は参照目的で付加されているだけなので注意してください。この番号は実際のファイルには表示されません。


関連項目:

<verify-username-token>要素の詳細は、「インバウンド・メッセージに対するセキュリティ要素」を参照してください。


次の構成は例4-1と似ていますが1つだけ大きな違いがあります。

  • 行番号6〜14: ユーザー名検証はgetCatalog操作に対してのみ適用されます。

例4-2 操作レベルのユーザー名トークン検証に対するサーバー側構成ファイルの例

1. <oracle-webservices>
2.   <webservice-description name="SecureService">
3.   <port-component name="SecureServiceSoap">
4.       <runtime enabled="security"/>
5.   <operations>
6.     <operation name="getCatalog">
7.     <runtime>
8.     <security>
9.     <inbound>
10.       <verify-username-token/>
11.    </inbound>
12.    </security>
13.    </runtime>
14.  </operation>
15. </operations>
16. </port-component>
17. </webservice-description>
18. </oracle-webservices>

XML署名および復号化を検証するためのサーバー側ポート・レベル・セキュリティ構成の定義

設定がポート・レベルで行われるため、ポートのあらゆる操作に対してアクセスが付与される前に検証が実行される必要があります。キーストア、暗号要素および署名要素の構成の詳細は、「キーストア要素」「署名および暗号の鍵の要素」を参照してください。行番号は参照目的で付加されているだけなので注意してください。この番号は実際のファイルには表示されません。

  • 行番号4〜25: これらの行はポート・レベルにおけるキーストア、鍵およびインバウンド・ポリシーを設定します。キーストアおよび鍵の生成の詳細は、第3章「Webサービス・セキュリティの管理」を参照してください。

  • 行番号6〜8: これらの行はアプリケーションでデプロイされるキーストアを示すkey-store path属性を設定します。store-pass属性にはキーストア・パスワードが含まれます。signature-key alias属性は信頼できる証明書を検証するために使用されます。encryption-key alias属性はメッセージを復号化するために使用されます。signalias/encaliastestks.jksファイルに存在する必要があるので注意してください。

  • 行番号11〜18: これらの行はメッセージ整合性ポリシーを指定します。サーバーはボディおよびタイムスタンプが署名されていることを要求します。署名には、作成時間に設定されたcreated値を持つタイムスタンプが必要です。expiry属性は署名が期限切れになるときを指定します(つまり現在の時間は、作成時間の値プラスexpiryの値よりも前になります)。clock-skew属性の値は、Webサービス・クライアントとWebサービスが別のマシンに存在する際に、システム時計を調整するために使用されます。

  • 行番号19〜23: これらの行はメッセージ秘匿性ポリシーを指定します。サーバーはメッセージ・ボディのコンテンツが暗号化されていることを要求します。

例4-3 復号化および署名検証に対するキーストアとインバウンド・ポリシーが設定されたサーバー側構成ファイルの例

1. <oracle-webservices>
2. <webservice-description name="SecureHelloService">
3. <port-component name="SecureHelloPort">
4. <runtime enabled="security">
5. <security>
6. <key-store path="META-INF/testks.jks" store-pass="keystorepwd"/>
7. <signature-key alias="signalias" key-pass="signkeypwd"/>
8. <encryption-key alias="encalias" key-pass="enckeypwd"/>
9.     </security>
10.    <inbound>
11.      <verify-signature>
12.        <tbs-elements>
13.          <tbs-element name-space="http://schemas.xmlsoap.org/soap/envelope/" local-part="Body"/>
14.          <tbs-element name-space="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" local-part="Timestamp"/>
15.        </tbs-elements>
16.          <verify-timestamp created="true" expiry="28800"/>
17.          <property name="clock-skew" value="3000" />
18.      </verify-signature>
19.      <decrypt>
20.        <tbe-elements>
21.          <tbe-element name-space="http://schemas.xmlsoap.org/soap/envelope/" local-part="Body"/>
22.        </tbe-elements>
23.      </decrypt>
24.    </inbound>
25.   </runtime>
26.   <operations>
27.     <operation name="sayHello">
28.     </operation>
29.   </operations>
30.   </port-component>
31.   </webservice-description>
32. </oracle-webservices>

XML署名および復号化に対するサーバー側操作レベル・セキュリティ構成の定義

例4-4 に、署名検証および復号化に対してグローバル・レベル・キーストア設定が使用される、サーバー側Webサービス構成ファイルの例を示します。行番号は参照目的で付加されているだけなので注意してください。この番号は実際のファイルには表示されません。

  • 行番号7〜26: これらの行はsayHello()操作に対してセキュリティが実施されることを示しています。サーバーは署名および暗号化が行われたメッセージを受信します。

  • 行番号10〜17: これらの行はメッセージ整合性ポリシーを指定します。サーバーはメッセージ・ボディおよびタイムスタンプが署名されていることを要求します。署名には、作成時間に設定されたcreated値を持つタイムスタンプが必要です。expiry属性はタイムスタンプが期限切れになるときを指定します(つまり現在の時間は、作成時間の値プラスexpiryの値よりも前になります)。clock-skew属性は、Webサービス・クライアントとWebサービスが別のマシンに存在する際に、システム時計を調整するために使用されます。

  • 行番号18〜22: これらの行はメッセージ秘匿性ポリシーを指定します。サーバーはボディのコンテンツが暗号化されていることを要求します。

例4-4 操作レベルの復号化および署名検証が設定されたサーバー側構成ファイルの例

1. <oracle-webservices>
2.   <webservice-description name="SecureHelloService">
3.   <port-component name="SecureHelloPort">
4.   <runtime enabled="security">
5.   <operations>
6.     <operation name="sayHello">
7.     <runtime>
8.     <security>
9.     <inbound>
10.     <verify-signature>
11.      <tbs-elements>
12.        <tbs-element name-space="http://schemas.xmlsoap.org/soap/envelope/" local-part="Body"/>
13.        <tbs-element name-space="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" local-part="Timestamp"/>
14.      </tbs-elements>
15.        <verify-timestamp created="true" expiry="28800"/>
16.        <property name="clock-skew" value="3000" />
17.    </verify-signature>
18.    <decrypt>
19.      <tbe-elements>
20.        <tbe-element name-space="http://schemas.xmlsoap.org/soap/envelope/" local-part="Body"/>
21.      </tbe-elements>
22.    </decrypt>
23.    </inbound>
24.    </security>
25.    </runtime>
26.    </operation>
27.   </operations>
28.  </port-component>
29.  </webservice-description>
30. </oracle-webservices>

クライアント側セキュリティ構成ファイルの作成

この項では、ユーザー名トークンを生成するための、クライアント側Webサービス・セキュリティ構成ファイルの作成方法を説明します。この例ではファイルはclientConfig.xmlと名付けられます。WebServicesAssemblerツールはこのファイルで見つかったデータを、<generated_name>_Stub.xmlのクライアント側デプロイメント・ディスクリプタに付加します。


注意:

Oracle JDeveloperを使用してWebサービスを保護する場合、セキュリティ構成は<generated_name>_Stub.xmlファイルに対して自動的に生成されます。

次に、クライアント側Webサービス・セキュリティ構成ファイルの一般的な作成手順を示します。

  1. テキスト・エディタを使用してファイルを作成します。

    例4-5clientConfig.xmlというクライアント側構成ファイルの例を示します。

  2. XML要素を入力して、ファイルのユーザー名トークン・セキュリティ構成を生成します。

    次の項では、ユーザー名トークンと署名および暗号に対するクライアント側セキュリティ構成ファイルの例を説明します。

  3. ファイルを保存します。

ユーザー名トークンに対するクライアント側ポート・レベル・セキュリティ構成の定義

例4-5 に、ポート・レベルでセキュリティを実施するクライアント側Webサービス構成ファイルの例を示します。この例では、サービスがポート・レベルで公開するあらゆる操作にアクセスするため、クライアントがユーザー名およびパスワードを送信する必要があります。行番号は参照目的で付加されているだけなので注意してください。この番号は実際のファイルには表示されません。


関連項目:

<username-token>要素の詳細は、「アウトバウンド・メッセージに対するユーザー名トークン要素」を参照してください。


  • 行番号4〜10: この例ではセキュリティがポート・レベルで適用されます。<runtime enabled="security">要素は実行時に、<security>要素で定義されたポリシーに基づいてクライアントが保護されることを示しています。セキュリティがポート・レベルで構成されるため、Webサービスのすべての操作に対して同じセキュリティが適用されます。

  • 行番号6〜8: <outbound>句はアウトバウンド・メッセージ・ポリシーを定義する場所です。<username-token>要素は、ユーザー名トークンがユーザー名SCOTTおよびパスワードTIGERでセキュリティ・ヘッダーに追加されることを示しています。PLAINTEXT(デフォルト)またはDIGESTのパスワード・タイプを指定することもできます。

例4-5 ポート・レベルのユーザー名トークン・セキュリティが指定されたクライアント側Webサービス構成ファイルの例

1. <oracle-webservice-clients>
2.  <webservice-client>
3.   <port-info>
4.   <runtime enabled="security">
5.   <security>
6.   <outbound>
7.     <username-token name="SCOTT " password="TIGER"/>
8.   </outbound>
9.   </security>
10.   </runtime>
11.     <operations>
12.     <operation name="sayHello"/>
13.    </operations>
14. </port-info>
15. </webservice-client>
16. </oracle-webservice-clients>

XML署名および暗号化に対するクライアント側ポート・レベル・セキュリティ構成の定義

例4-6 に、ポート・レベルでセキュリティを実施するクライアント側Webサービス構成ファイルの例を示します。この例では、構成はクライアント側キーストアに対するセキュリティ・ポリシー、鍵構成ポリシー、およびアウトバウンド・メッセージ・ポリシーを設定します。行番号は参照目的で付加されているだけなので注意してください。この番号は実際のファイルには表示されません。

  • 行番号4〜24: これらの行はクライアント側キーストアに対するセキュリティ・ポリシー、鍵構成ポリシー、およびアウトバウンド・メッセージ・ポリシーを指定します。ユーザーはキーストアと署名鍵および暗号鍵を生成する必要があります。キーストアの作成と鍵の追加の詳細は、「キーストアの使用方法」を参照してください。

  • 行番号6〜7: これらの行はクライアント側のキーストア・パスと署名鍵の別名を指定します。

  • 行番号8〜22: これらの行はアウトバウンド・メッセージ・ポリシーを指定します。

  • 行番号9〜15: これらの行は署名ポリシーを指定します。この例では、これらの行はボディおよびタイムスタンプが署名される必要があることを示しています。

  • 行番号16〜21: リクエストの暗号化に使用される暗号化ポリシーと受信者鍵を指定します。

例4-6 ポート・レベルの署名および暗号化セキュリティが指定されたクライアント側Webサービス構成ファイルの例

1. <oracle-webservice-clients>
2.  <webservice-client>
3. <port-info>
4.   <runtime enabled="security">
5.   <security>
6.     <key-store path="etc/testks.jks" store-pass="keystorepwd"/>
7.     <signature-key alias="signalias" key-pass="signkeypwd"/>
8.       <outbound>
9.        <signature>
10.          <tbs-elements>
11.            <tbs-element name-space="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" local-part="Timestamp"/>
12.           <tbs-element name-space="http://schemas.xmlsoap.org/soap/envelope/" local-part="Body"/>
13.         </tbs-elements>
14.           <add-timestamp created="true" expiry="28800"/>
15.       </signature>
16.       <encrypt>
17.         <tbe-elements>
18.           <tbe-element name-space="http://schemas.xmlsoap.org/soap/envelope/" local-part="Body"/>
19.           </tbe-elements>
20.           <recipient-key alias="encalias"/>
21.       </encrypt>
22.      </outbound>
23.  </security>
24.  </runtime>
25.  <operations>
26.    <operation name="sayHello">
27.    </operation>
28.  </operations>
29. </port-info>
30. </port-component>
31. </webservice-description>
32. </oracle-webservices>
33. </webservice-client>
34. </oracle-webservice-clients>

認証のためのユーザーの作成

サーバーは、ユーザー名ポリシーで保護されたWebサービスにアクセスしようとするユーザーを認証するため、ユーザー名とパスワードを要求します。このデータを提供するため、インスタンス・レベルのsystem-jazn-data.xmlファイルで各ユーザーに対する情報を入力できます。このファイルのパスはOC4J_HOME/j2ee/<instance_name>/config/system-jazn-data.xmlです。


関連資料:

system-jazn-data.xmlファイルのコンテンツの詳細は、『Oracle Containers for J2EEセキュリティ・ガイド』を参照してください。


Application Server Controlを使用したユーザー・エントリの追加

Application Server Controlコンソールにはユーザーおよびパスワードを作成し、それをサーバーに追加できる画面が用意されています。


関連資料:

詳細は、Application Server Controlのオンライン・ヘルプでセキュリティ・プロバイダのロールおよびユーザーの管理に関するトピックを参照してください。


クライアントJARファイル

表4-1に、セキュリティをWebサービス・クライアントにアセンブルする場合に必要なクライアントJARファイルの一覧を表示します。


関連資料:

『Oracle Application Server Web Services開発者ガイド』の付録「Webサービス・クライアントのAPIおよびJAR」に、Webサービス・クライアントをコンパイルするためのクラスパスに示されるその他のJARの一覧があります。


表4-1 セキュリティ用のクライアントJARファイル

JARの名前とパス 説明

OC4J_HOME/jlib/jaxen.jar

Jaxen、つまり複数のモード(dom4j、JDOMなど)に対してXPath式を評価可能なJava XPath Engineを、定義するクラスが含まれます。

OC4J_HOME/jlib/osdt_wss.jar

Oracle Security Developer's ToolkitのWeb Services Security(WS-Security) APIが含まれます。

OC4J_HOME/jlib/osdt_cert.jar

Oracle Security Developer's Toolkitの暗号化APIが含まれます。

OC4J_HOME/jlib/osdt_xmlsec.jar

Oracle Security Developer's ToolkitのXML署名および暗号化のAPIが含まれます。

OC4J_HOME/jlib/osdt_core.jar

Oracle Security Developer's Toolkit(OSDT)のAPIが含まれます。

OC4J_HOME/jlib/osdt_saml.jar

Oracle Security Developer's ToolkitのSecurity Assertion Markup Language(SAML) APIが含まれます。

OC4J_HOME/jlib/oraclepki.jar

Oracleのorapki keytoolユーティリティが含まれます。

OC4J_HOME/j2ee/home/jazn.jar

JAZN(Oracle JAASプロバイダ)管理ツールが含まれます。

OC4J_HOME/j2ee/home/jazncore.jar

JAZN(Oracle JAASプロバイダ)実装が含まれます。

OC4J_HOME/j2ee/home/jaznplugin.jar

JAZN(Oracle JAASプロバイダ)カスタム・プラグイン・モジュールが含まれます。


トランスポート・レベル・セキュリティのWebサービスへの追加

Basic、Digest、またはクライアント証明書(client-cert)の認証を使用することで、トランスポート・レベルのWebサービスを保護できます。Webサービスがバージョン2.1または3.0のEJBからアセンブルされた場合は、oracle-webservices.xmlデプロイメント・ディスクリプタに追加を行うことでトランスポート・レベルのWebサービスを保護できます。この項では、トランスポート・レベルで保護されたWebサービスにアクセスするための、J2SEおよびJ2EEクライアントの記述方法についても説明します。

Basic認証の追加

Basic認証では、ユーザーはOracleAS Single Sign-Onを使用することなく、直接ユーザー名およびパスワードを求められます。ログイン・モジュール(RealmLoginModuleなど)がログイン・ダイアログの生成に使用されます。

トランスポート・レベルでBasic認証を指定するには、web.xml<login-config><auth-method>下位要素にBASICという値を指定します。次に例を示します。

<web-app ...>
   ...
   <login-config>
      <auth-method>BASIC</auth-method>
      ...
   <login-config>
   ...
</web-app>

関連資料:

Basic認証の指定の詳細は、『Oracle Containers for J2EEセキュリティ・ガイド』を参照してください。


Digest認証の追加

Digest認証メカニズムでは、クライアントが認証のために指定するパスワードが、MD5ダイジェストを使用して暗号化されます。これはリクエスト・メッセージで転送されます。ユーザーの視点では、Digest認証はBasic認証と同じように動作します。

トランスポート・レベルでDigest認証を指定するには、web.xml<login-config><auth-method>下位要素にDIGESTという値を指定します。次に例を示します。

<web-app ...>
   ...
   <login-config>
      <auth-method>DIGEST</auth-method>
      ...
   <login-config>
   ...
</web-app>

関連資料:

Digest認証の指定の詳細は、『Oracle Containers for J2EEセキュリティ・ガイド』を参照してください。


クライアント証明書認証の追加

クライアント証明書(client-cert)メソッドはHTTPSによってクライアントを認証します。ユーザーは公開鍵証明書を保持している必要があります。

トランスポート・レベルでclient-cert認証を指定するには、web.xml<login-config><auth-method>下位要素にCLIENT-CERTという値を指定します。次に例を示します。

<web-app ...>
   ...
   <login-config>
      <auth-method>CLIENT-CERT</auth-method>
      ...
   <login-config>
   ...
</web-app>

関連資料:

client-cert認証の指定の詳細は、『Oracle Containers for J2EEセキュリティ・ガイド』を参照してください。


EJBをベースとするWebサービスに対するトランスポート・レベル・セキュリティの追加

バージョン2.1および3.0のEnterprise JavaBeans(EJB)はWebサービスとして公開できます。oracle-webservices.xmlデプロイメント・ディスクリプタの<ejb-transport-security-constraint>および<ejb-transport-login-config>要素を構成することで、EJBに基づくWebサービスに対してトランスポート・レベルのセキュリティ制約を定義できます。

<ejb-transport-security-constraint>要素では、セキュリティ制約がSOAPポートまたはWSDL URL、あるいはその両方のどれに適用されるのか指定できます。セキュリティ・ロールやトランスポート保証も指定できます。

<ejb-transport-login-config>要素では、EJBアプリケーションがBasic認証、Digest認証、またはクライアント証明書のどれを認証メカニズムとして使用するか指定できます。

保護されたEJB Webサービスのクライアントは、保護されたサービスに対してユーザー名とパスワードを渡すように、次のいずれかの方法で構成できます。


関連資料:

この項で説明した要素の使用方法の詳細は、oracle-webservices-10_0.xsdスキーマと『Oracle Application Server Web Services開発者ガイド』の「Webサービスのパッケージ化およびデプロイ」を参照してください。


例4-7に、oracle-webservices.xmlデプロイメント・ディスクリプタの<ejb-transport-security-constraint>およびその下位要素を示します。この要素は、Webサービスとして公開されるバージョン2.1または3.0のEJBに対するトランスポート・レベル・セキュリティ制約を関連付けます。Webサービスとして公開されるEJBのURLは、ポート・コンポーネントの<endpoint-address-uri>要素で示されます。下位要素の<wsdl-url><soap-port>は、セキュリティ制約がWSDL URLまたはSOAPポートのどちらに適用されるか選択できる識別子です。<wsdl-url><soap-port><ejb-transport-security-constraint>要素内に両方存在する場合、または両方存在しない場合は、セキュリティ制約がWSDL URLおよびSOAPポートの両方に適用されます。

例4-7 oracle-webservices.xmlの<ejb-transport-security-constraint>要素

...
   <port-component name="String">
       <endpoint-address-uri>String</endpoint-address-uri>
       <ejb-transport-security-constraint>
             <wsdl-url/>
             <soap-port/>
             <role-name>Manager</role-name>
             <role-name>Administrator</role-name>
             <transport-guarantee>NONE</transport-guarantee>
       </ejb-transport-security-constraint>
      ...
   </port-component>
...

例4-8に、oracle-webservices.xmlデプロイメント・ディスクリプタの<ejb-transport-login-config>およびその下位要素を示します。この要素はトランスポート・レベルの認証メソッド(Basic、Digest、クライアント証明書など)と、このEJBアプリケーションで使用されるレルム名を構成します。Webサービスとして公開されるEJBアプリケーションのURLは、ポート・コンポーネントの<endpoint-address-uri>要素で示されます。

例4-8 oracle-webservices.xmlの<ejb-transport-login-config>要素

...
   <ejb-transport-login-config>
       <auth-method>BASIC</auth-method>
       <realm-name>sec-ejb</realm-name>
   </ejb-transport-login-config>
...

ユーザー名とパスワードを要求するWebサービスへのアクセス

WebサービスがHTTP認証またはWS-Securityユーザー名トークン認証により保護されている場合、メッセージを渡すにはクライアントはユーザー名およびパスワードを入力する必要があります。

次の項では、HTTP認証またはWS-Securityユーザー名トークン認証で保護されたWebサービスにアクセスするためにJ2SEまたはJ2EEクライアントが使用できるプロパティおよびフィールド値について説明します。また、クライアントがプラグラムにおいて、または静的構成の一部として使用可能なこれらのプロパティおよび値の作成方法も説明します。

HTTP認証プロパティ

HTTP認証の場合、javax.xml.rpc.Stubおよびjavax.xml.rpc.Callインタフェースで使用可能なプロパティは次のとおりです。

javax.xml.rpc.security.auth.username
javax.xml.rpc.security.auth.password

操作性をさらに向上するため、これらのインタフェースはプロパティに対する定数フィールド値も定義します。

javax.xml.rpc.Stub.USERNAME_PROPERTY
javax.xml.rpc.Stub.PASSWORD_PROPERTY
javax.xml.rpc.Call.USERNAME_PROPERTY
javax.xml.rpc.Call.PASSWORD_PROPERTY

WS-Securityユーザー名トークン認証のフィールド値

WS-Securityの場合、Webサービス・クライアントは、スタブ・フィールド値を使用してユーザー名とパスワードを渡すことができます。次の項では、これらのスタブ・フィールド値の使用方法について説明します。

Stub.USERNAME_PROPERTY
Stub.PASSWORD_PROPERTY

プログラム的な認証情報の受渡し

ユーザー名およびパスワード値をクライアントに対してプログラム的に渡すには、Javaプロパティ(javax.xml.rpc.Stub.USERNAME_PROPERTYPASSWORD_PROPERTYjavax.xml.rpc.Call.USERNAME_PROPERTYおよびPASSWORD_PROPERTY)を使用できます。

次の2つは、HTTP認証およびWS-Securityユーザー名トークン認証の例です。例では、クライアントに対しユーザー名とパスワードを渡します。ユーザー名とパスワードは生成されたWebサービス・クライアント・ファイルの1つに追加されます。このファイルは<service>SoapHttp_Stub.javaといいます。この方法はJ2EE Webサービス・クライアントでのみ使用できます。

HTTP認証

次のHTTP認証の例では、生成されたEchoSoapHttp_Stub.javaクライアント・ファイルはEcho Webサービスにアクセスしています。このファイルはユーザー名およびパスワードの資格証明を追加するために編集されます。javax.xml.rpc.security.auth.usernameおよびpasswordプロパティが_setPropertyメソッドに追加されます。

  /*
     *  public constructor
     */
    public EchoSoapHttp_Stub(HandlerChain handlerChain) {
        super(handlerChain);
        _setProperty(ENDPOINT_ADDRESS_PROPERTY,
"http://aaabbb.mycompany.com:8888/WebServicesDemos-Echo-context-
root/echoSoapHttpPort");
        // Added for HTTP authentication
        _setProperty("javax.xml.rpc.security.auth.username","helen");
        _setProperty("javax.xml.rpc.security.auth.password","welcome");
        setSoapVersion(SOAPVersion.SOAP_11);
        setServiceName( new QName("http://demo/","echo"));
        setPortName( new QName("http://demo/","echoSoapHttpPort"));
        setupConfig("echoclient/proxy/runtime/EchoSoapHttp_Stub.xml");
    }
WS-Securityユーザー名トークン認証

WS-Securityユーザー名トークンの場合、まずクライアントにトークンのサポートを生成する必要があります。クライアントをWebServicesAssemblerのgenProxyコマンドでアセンブルするときに、ddFileName引数とともにクライアント構成ファイルを指定します。クライアント構成ファイルでユーザー名トークン認証を有効化します。例4-9genProxyコマンドのサンプルを示しています。

例4-9 genProxyコマンドのサンプル

<oracle:genProxy
   wsdl="http://localhost:8888/webservice/webservice?WSDL"
   unwrapParameters="false"
   output="build/src/client"
   packageName="MyService"
   ddFileName="clientConfig.xml"
>
   <classpath>
      <pathelement path="${common.webservices.class.path}"/>
      <pathelement location="${ORACLE_HOME}/webservices/lib/wsa.jar}"/>
   </classpath>
</oracle:genProxy>

例4-10はWS-Securityユーザー名トークンを有効化するクライアント構成ファイルのサンプルのコンテンツを示しています。このファイルはoracle-webservices-client-10_0.xsdに基づいています。<outbound>セクションに<username-token>要素があることに注意してください。プログラム的に指定されるため、トークンのためにusernamepassword属性を指定する必要はありません。

例4-10 WS-Securityユーザー名トークン認証のためのクライアント構成ファイルのサンプル

<oracle-webservice-clients>
<webservice-client>

<port-info>
<runtime enabled="security">
 <security>
  <outbound>
   <username-token name="" password-type="PLAINTEXT" add-nonce="true" add-created="false"/>
  </outbound>
 </security>
</runtime>
<operations>
 <operation name="echoUser"/>
</operations>
</port-info>
</webservice-client>
</oracle-webservice-clients>

例4-11は生成されたプロキシ・クライアント・コードを呼び出すJavaプログラムを示しています。Stub.USERNAME_PROPERTYおよびStub.PASSWORD_PROPERTYプロパティを使用してユーザー名とパスワードをプログラム的に渡すことができます。

例4-11 ユーザー名およびパスワードのプログラム的指定

...
Context ic = new InitialContext();
Service service = (Service) ic.lookup("java:comp/env/service/MyEchoServiceRef");
//Service.getPort(portQName,SEI class)
EchoInterface echoPort = (EchoInterface) service.getPort(portQName,echo.EchoInterface.class);
Stub port = (Stub) echoPort;
     port.setProperty(Stub.USERNAME_PROPERTY, "helen");
     port.setProperty(Stub.PASSWORD_PROPERTY, "welcome");
...

プロパティのかわりに、生成されたプロキシで指定された次のメソッドを使用できます。

setUsername(String username)
setPassword(String password)

静的な認証情報の受渡し

静的な構成を渡すには、Webサービスに対して該当するorion-*.xmlファイルを編集します。この方法はJ2EEまたはJ2SE Webサービス・クライアントで使用できます。

HTTP認証

Webサービスにアクセスするには、デプロイメント・ディスクリプタでユーザー名およびパスワードを渡します。そのためには、サービスのorion-*.xmlファイルにある<service-ref-mapping>要素を手動で編集する必要があります。

静的クライアント・プロキシでサービス・エンドポイントにアクセスする場合は、<stub-property>下位要素を<service-ref-mapping>要素に追加します。Dynamic Invocation Interface(DII)を使用してサービス・エンドポイントを動的に起動する場合は、かわりに<call-property>要素を追加します。


関連資料:

<call-property>および<stub-property>要素の詳細は、『Oracle Application Server Web Services開発者ガイド』を参照してください。


<service-ref-mapping>句と、<call-property>および<stub-property>要素に指定する値の編集手順を次に示します。

  1. Webサービスに対して該当するorion-*.xmlデプロイメント・ディスクリプタの<service-ref-mapping>要素を編集します。

    • クライアント・プロキシを使用する場合は、ユーザー名およびパスワードに対する<stub-property>下位要素を入力します。

    • サービス・エンドポイントを動的に起動する場合は、<call-property>下位要素を入力します。

  2. ステップ1で入力したstub-またはcall-property要素の<name>および<value>下位要素に、ユーザー名プロパティjavax.xml.rpc.security.auth.usernameとその値を指定します。

  3. ステップ1で入力したstub-またはcall-property要素の<name>および<value>下位要素に、ユーザー名プロパティjavax.xml.rpc.security.auth.passwordとその値を指定します。

  4. Webサービス・クライアントを生成するときは、orion-*.xmlデプロイメント・ディスクリプタをWebServicesAssemblerのgenProxyコマンドの入力として指定します。

例4-12に、保護されたWebサービスにアクセスするため<stub-property>要素を使用してユーザー名およびパスワードを指定する、<service-ref-mapping>句の例を示します。javax.xml.rpc.security.auth.usernameおよびpasswordプロパティとそれらの値は<stub-property>の子要素として追加されます。

例4-12 orion-*.xmlファイル内のHTTP認証構成のサンプル

  ...
   <service-ref-mapping name="service/MyEchoServiceRef">
      ...
      <stub-property>
               <name>javax.xml.rpc.security.auth.password</name>
               <value>welcome</value>
      </stub-property>
      <stub-property>
                 <name>javax.xml.rpc.security.auth.username</name>
                 <value>helen</value>
      </stub-property>
   </service-ref-mapping >
   ...
WS-Securityユーザー名トークン認証

WS-Securityユーザー名トークンの場合、クライアントにトークンのサポートを生成します。クライアントをWebServicesAssemblergenProxyコマンドでアセンブルするときに、ddFileName引数とともにクライアント構成ファイルを指定します。例4-13genProxyコマンドのサンプルを示しています。

例4-13 genProxyコマンドのサンプル

<oracle:genProxy
   wsdl="http://localhost:8888/webservice/webservice?WSDL"
   unwrapParameters="false"
   output="build/src/client"
   packageName="MyService"
   ddFileName="clientConfig.xml"
>
   <classpath>
      <pathelement path="${common.webservices.class.path}"/>
      <pathelement location="${ORACLE_HOME}/webservices/lib/wsa.jar}"/>
   </classpath>
</oracle:genProxy>

例4-14はWS-Securityユーザー名トークン認証を有効化するクライアント構成ファイルのサンプルを示しています。このファイルはoracle-webservices-clients.xsdに基づいています。<outbound>セクションに<username-token>要素があることに注意してください。この場合、トークンに対するusernameおよびpassword属性を指定します。これらの属性の値により、サービスにアクセスするためにクライアントからメッセージを送信することができます。

例4-14 WS-Securityユーザー名トークン認証のためのクライアント構成ファイルのサンプル

<oracle-webservice-clients><webservice-client><port-info><runtime enabled="security"> <security>  <outbound>
 <username-token name="" username="helen" password="welcome" password-type="PLAINTEXT" add-nonce="true" add-created="false"/>
  </outbound>
 </security>
</runtime>
<operations>
 <operation name="echoUser"/>
</operations>
</port-info>
</webservice-client>
</oracle-webservice-clients>

WebサービスからEJBへのIDの伝播

Oracle Web Serviceセキュリティの実装では、WebサービスがEJBを起動する際にユーザーのIDの伝播について一体的な統合を提供します。

Webサービスはメッセージ・レベル・セキュリティを使用して認証されます。WebサービスからEJBにアクセスする際に再認証は必要ありません。同じWebサービスのユーザーIDがEJBに伝播されます。EJBアプリケーションは、javax.ejb.EjbContext.getCallerPrincipalなどの標準的なEJBメソッドを使用してユーザーIDにアクセスできます。

以降のアクセス・チェックはjavax.ejb.EjbContext.isCallerInRoleを使用して実行できます。


注意:

EJBアプリケーションはJ2EEセキュリティで構成する必要があります。詳細は、『Oracle Containers for J2EEセキュリティ・ガイド』の「EJBのセキュリティの構成」を参照してください。

AntタスクとWebServicesAssembler

WebServicesAssemblerツールはOracleAS Web Servicesのアセンブルを支援します。このツールを使用することで、サービスをトップ・ダウン(WSDLから)またはボトム・アップ(Javaクラス、EJB、JMS宛先、またはデータベース・リソースから)のどちらで作成している場合でも、Webサービスの開発およびデプロイに必要なアーチファクトを生成できます。WebServicesAssemblerツールは、WSDLをベースとしたWebサービス・クライアント・オブジェクトを作成する際にも起動できます。

WebServicesAssemblerツールはコマンドラインまたはAntタスクのどちらかで起動できます。WebServicesAssemblerツールを使用するとWebサービスをフレキシブルにアセンブルできます。アセンブリ・プロセスを多数のステップに分割するため、Webサービスの作成をより細かく制御できます。

次に、WebServicesAssemblerツールで実行可能なタスクの概要を列記します。


関連資料:

各タスクを実行するためのWebServicesAssemblerコマンドの使用の詳細は、『Oracle Application Server Web Services開発者ガイド』の「WebServicesAssemblerの使用方法」を参照してください。


Webサービス・アプリケーションにおける認証済ユーザーIDの取得

サーバー上で、ユーザーはユーザー名(プレーン・テキストまたはダイジェスト)、SAMLまたはX.509セキュリティ・トークンから認証済ユーザーの名前を取得できます。この情報は、ユーザーがその他のサーバー・リソースへのアクセスを許可される前の、追加的な検証チェックに使用できます。この項では、AccessControlContextおよびServiceLifeCycleのAPIによるユーザーIDの取得について説明します。

AccessControlContext APIによる認証済サブジェクトの取得

java.security.AccessControlContextjava.security.AccessControllerおよびjavax.security.auth.Subjectクラスのメソッドを使用して、認証済サブジェクトを取得できます。


関連資料:

この項で説明するクラスおよびメソッドの詳細は、次のWebサイトでjava.securityおよびjavax.security.authパッケージのAPIを参照してください。

http://java.sun.com/j2se/1.4.2/docs/api/index.html



注意:

認証済サブジェクトを取得する目的の1つは、JAAS Provider認証の実行です。「WebサービスにおけるJAAS Provider認証の実行」で、Webサービスにおけるこの認証タイプの実行の概要を説明します。

次に、AccessControllerオブジェクトからの認証済サブジェクトの一般的な取得手順を示します。

  1. AccessController.getContextメソッドをコールしてAccessControlContextオブジェクトを作成します。getContextメソッドは現在のコール中コンテキストのスナップショットを取得して、それをAccessControlContextオブジェクトに返します。

  2. Subject.getSubjectメソッドを使用してコンテキストのサブジェクトを取得します。

例4-15に、AccessControlContextAccessControllerおよびSubjectのAPIを使用した認証済ユーザーの名前の取得を示します。

例4-15 AccessControlContext APIによる認証済ユーザーの名前の取得

java.security.AccessControlContext context =
           java.security.AccessController.getContext();
javax.security.auth.Subject sub = javax.security.Subject.getSubject(context);

ServiceLifeCycle APIによる認証済プリンシパルの取得

ユーザーはjavax.xml.rpc.server.ServiceLifecycleおよびServletEndpointContextインタフェースを使用して、SAML、ユーザー名またはX.509セキュリティ・トークンからユーザー情報を取得できます。たとえば、ServletEndpointContext.getUserPrincipalメソッドは認証済ユーザーの名前を返し、ServletEndpointContext.isUserInRoleメソッドはユーザーが特定のロールに属すかどうかを返します。


関連資料:

ServiceLifecycleおよびServletEndpointContextインタフェースの詳細は、次のWebサイトでjavax.xml.rpc.serverパッケージのAPIを参照してください。

http://java.sun.com/j2ee/1.4/docs/api/index.html


Webサービスからユーザー情報を取得するには、次の手順に従います。

  1. Webサービスに対してServiceLifecycleインタフェースを実装します。

  2. ServiceLifecycle.initメソッドの実装で、contextパラメータをServletEndpointContextにキャストします。

  3. ServletEndpointContext contextパラメータでgetUserPrincipalisUserInRoleなどのメソッドをコールしてユーザー情報を取得します。

例4-16に、安全なWebサービスからの認証済ユーザーの名前の取得を示します。この例でSecureServiceクラスはServiceLifecycleインタフェースを実装します。initメソッドの実装で、contextパラメータがServletEndpointContextインタフェースにキャストされます。getUserPrincipalメソッドは、getNameへのコールで取得された、認証済ユーザー名へのアクセスを返します。

例4-16 ServiceLifeCycle APIによる認証済ユーザーの名前の取得

package test;

public class SecureService implements javax.xml.rpc.server.ServiceLifecycle {

 private javax.xml.rpc.server.ServletEndpointContext context;

    public void init(Object obj) throws javax.xml.rpc.ServiceException {
        context = (javax.xml.rpc.server.ServletEndpointContext)obj;
    }

    public String helloUser(String message) throws java.rmi.RemoteException {
        java.security.Principal principal = context.getUserPrincipal();
        if(principal == null) {
            throw new RuntimeException("Principal not found");
        }
        String userName = principal.getName();
        return "Hi "+userName+"! "+message;
    }
    public void destroy() {
        context = null;
    }
}

WebサービスにおけるJAAS Provider認証の実行

OracleAS Web Servicesには、非常にスケーラブルなJava Authentication and Authorization Service(JAAS)プロバイダであるOracleAS JAAS Providerが付属しています。OracleAS Web Servicesは、保護対象リソースに対する詳細なアクセス制御を実施するJAAS認証を使用してリソースを保護できます。

次に、WebサービスにおけるJAAS認証の一般的な実行手順を示します。

  1. セキュリティ・トークンから認証済サブジェクトを取得します。

    認証済サブジェクトの取得の詳細は、「AccessControlContext APIによる認証済サブジェクトの取得」を参照してください。

  2. 認証済サブジェクトを使用して、checkPermissionなどのJAAS認証コールを発行します。


関連資料:

JAAS Provider認証の詳細は、『Oracle Containers for J2EEセキュリティ・ガイド』を参照してください。


WS-SecurityとXML API

安全なメッセージ機能などの基本タスクから、サービス指向アーキテクチャの安全な実装などのより複雑なプロジェクトにいたるまでの強固なセキュリティ・アプリケーションの開発に必要とされる、暗号的な構築ブロックがOracle Security Developer Tools(OSDT)によって提供されます。このツールは暗号化、公開鍵インフラストラクチャ、Webサービス・セキュリティおよびフェデレーテッドID管理の中核的基盤を基礎としています。


関連資料:

OSDTのリファレンス・ガイドおよびJavadocは次のWebサイトにあります。

http://download-east.oracle.com/docs/cd/B14099_15/idmanage.htm


開発の決定

第5章「安全なWebサービスの使用例」で、セキュリティをWebサービスに統合する様々な方法を示すいくつかの使用例を説明します。