この章では安全な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サービス・ページに関するトピックを参照してください。 |
OracleAS Web Servicesセキュリティでは、Webサービスに対するセキュリティ・ポリシーがXML構成ファイルで指定されます。指定されるセキュリティ・ポリシーの例としては、ユーザー名トークン認証や、SOAPメッセージ・ボディのXML署名および暗号化などがあります。
WebServicesAssemblerツールは、構成ファイルで宣言されたポリシーをアセンブル時にWebサービスへ追加します。ポリシーはボトム・アップ・アプローチまたはトップ・ダウン・アプローチのどちらかでサービスにアセンブルできます。ユーザーはサーバーに対して1つの構成ファイルを、またクライアントに対して対応するファイルを用意する必要があります。
次の項で、セキュリティのWebサービスへのアセンブル方法について説明します。
次の項では、サーバーおよびクライアントに対するファイルの作成方法について説明します。また、ユーザー名認証とXML署名および暗号化セキュリティ・ポリシーを実装するための、コンテンツの指定方法についても説明します。
次の手順は、既存のWSDLからトップ・ダウンでアセンブル中のWebサービス・アプリケーションにセキュリティ構成を追加する場合の一般的なアウトラインを示しています。このアセンブリを実行するため、WebServicesAssemblerツールにはtopDownAssemble
コマンドが用意されています。セキュリティの追加に関するステップのみを詳しく説明します。個々のステップの詳細が必要な場合は、『Oracle Application Server Web Services開発者ガイド』の「WSDLからのWebサービスのアセンブル」を参照してください。
WebServicesAssemblerを使用してサービス・エンドポイント・インタフェースを生成します。
Webサービスが生成される元となるWSDLをWebServicesAssemblerのgenInterface
コマンドの入力として指定します。
Javaコンパイラを使用して、ステップ1で生成されたインタフェースおよびタイプ・クラスをコンパイルします。
提供するWebサービスに対してJavaサービス・エンドポイントを実装します。
Javaサービス・エンドポイントには、ステップ1で生成されたJavaインタフェースのすべてのメソッドと一致するメソッド・シグネチャが必要です。
Javaサービス・エンドポイントをコンパイルします。
サーバー側のセキュリティ構成ファイルを作成します。
WebServicesAssemblerツールはこのファイルを使用して、セキュリティ情報をoracle-webservices.xml
のサーバー側デプロイメント・ディスクリプタに生成します。このファイルの作成手順については、「サーバー側セキュリティ構成ファイルの作成」を参照してください。
(オプション)キーストアを作成します。
データの署名または暗号化を行う場合、もしくは署名の検証やデータの復号化を行う場合は、信頼できる証明書と公開鍵および秘密鍵を格納するためのキーストアが必要です。Oracle WalletまたはJKSキーストアの作成の詳細は、「キーストアの作成」を参照してください。
(オプション)キーストアをバンドルします。
サーバー側セキュリティ構成で、インバウンド・ポリシーに<decrypt>
、<verify-signature>
、<verify-x509-token>
または<verify-saml-token>
要素が含まれる場合、あるいはアウトバウンド・ポリシーに<encrypt>
、<x509-token>
、<saml-token>
または<signature>
要素が含まれる場合は、アプリケーションにキーストアをバンドルするか、グローバル・レベル・キーストアを指定する必要があります。
アプリケーションにキーストアをバンドルするには、次の手順に従います。
サービスをアセンブルします。
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セキュリティ・ガイド』を参照してください。 |
OC4Jの実行中インスタンスに対してサービスをデプロイおよびバインドします。
Application Server Control、またはコマンドラインでadmin_client.jar
を使用することでサービスをデプロイできます。デプロイの詳細は、Application Server Controlのオンライン・ヘルプ内のアプリケーションのデプロイに関する項と、『Oracle Containers for J2EEデプロイメント・ガイド』を参照してください。
クライアントによって送信されたユーザー・データを認証するように、サーバー側セキュリティ・プロバイダを構成します。
セキュリティ・プロバイダの構成の詳細は、『Oracle Containers for J2EEセキュリティ・ガイド』を参照してください。
(オプション)デプロイが成功したことを確認します。OracleAS Web Servicesでは、デプロイされた各Webサービスに対して「Webサービス: テスト」ページが用意されます。
「Webサービス: テスト」ページの詳細は、『Oracle Application Server Web Services開発者ガイド』を参照してください。
クライアントのセキュリティ構成ファイルを作成します。
Webサービス・クライアントに適用されるセキュリティを指定する、クライアント構成ファイルを作成します。この例ではファイルはclientConfig.xml
と名付けられます。WebServicesAssemblerツールはこのファイルを使用して、クライアント側デプロイメント・ディスクリプタの<generated_name>
_Stub.xml
を生成します。クライアント構成ファイルの作成手順については、「クライアント側セキュリティ構成ファイルの作成」を参照してください。
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
を生成します。クライアント・アプリケーションはこのスタブを使用して、リモート・サービス上の操作を起動します。
クライアントをコンパイルして実行します。
次の手順は、ボトム・アップでアセンブル中のWebサービス・アプリケーションにセキュリティ構成を追加する場合の一般的なアウトラインを示しています。WebServicesAssemblerツールは、サービスをJavaクラス、EJB、JMS宛先またはデータベース・リソースからアセンブルするかどうかに基づいて様々な特定コマンドを提供します。これらのコマンドの概要は「AntタスクとWebServicesAssembler」にあります。
次の例では、WebサービスがJavaクラスからアセンブルされます。このアセンブリを実行するため、WebServicesAssemblerツールにはassemble
コマンドが用意されています。セキュリティの追加に関するステップのみを詳しく説明します。個々のステップの詳細が必要な場合は、『Oracle Application Server Web Services開発者ガイド』の「Javaクラスを使用したWebサービスのアセンブル」を参照してください。
Webサービスとして公開する対象のコンパイル済Javaクラスと、そのコンパイル済インタフェースを提供します。
Webサービスのセキュリティ構成ファイルを作成します。
この例ではファイルはserverConfig.xml
と名付けられます。WebServicesAssemblerツールはこのファイルを使用して、セキュリティ情報をoracle-webservices.xml
のサーバー側デプロイメント・ディスクリプタに生成します。このファイルの作成手順については、「サーバー側セキュリティ構成ファイルの作成」を参照してください。
(オプション)キーストアを作成します。
データの署名または暗号化を行う場合、もしくは署名の検証やデータの復号化を行う場合は、信頼できる証明書と公開鍵および秘密鍵を格納するためのキーストアが必要です。Oracle WalletまたはJKSキーストアの作成の詳細は、「キーストアの作成」を参照してください。
(オプション)キーストアをバンドルします。
サーバー側セキュリティ構成で、インバウンド・ポリシーに<decrypt>
、<verify-signature>
、<verify-x509-token>
または<verify-saml-token>
要素が含まれる場合、あるいはアウトバウンド・ポリシーに<encrypt>
、<x509-token>
、<saml-token>
または<signature>
要素が含まれる場合は、アプリケーションにキーストアをバンドルするか、グローバル・レベル・キーストアを指定する必要があります。
アプリケーションにキーストアをバンドルするには、次の手順に従います。
安全な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
: アプリケーション名を指定します。通常この名前は、context
やuri
などの他の引数のベース値として使用されます。
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セキュリティ・ガイド』のファイル・ベース・プロバイダの構成に関する項を参照してください。 |
サービスをデプロイしてバインドします。
Application Server Control、またはコマンドラインでadmin_client.jar
を使用することでサービスをデプロイできます。デプロイの詳細は、Application Server Controlのオンライン・ヘルプ内のアプリケーションのデプロイに関する項と、『Oracle Containers for J2EEデプロイメント・ガイド』を参照してください。
クライアントによって送信されたユーザー・データを認証するように、サーバー側セキュリティ・プロバイダを構成します。
セキュリティ・プロバイダ構成の詳細は、『Oracle Containers for J2EEセキュリティ・ガイド』を参照してください。
(オプション)デプロイが成功したことを確認します。OracleAS Web Servicesでは、デプロイされた各Webサービスに対して「Webサービス: ホーム」ページが用意されます。
「Webサービス: ホーム」ページの詳細は、『Oracle Application Server Web Services開発者ガイド』の「Webサービス・デプロイのテスト」を参照してください。
クライアントのセキュリティ構成を作成します。
Webサービス・クライアントに適用されるセキュリティを指定する、クライアント構成ファイルを作成します。この例ではファイルはclientConfig.xml
と名付けられます。WebServicesAssemblerツールはこのファイルを使用して、クライアント側デプロイメント・ディスクリプタの<generated_name>
_Stub.xml
を生成します。クライアント構成ファイルの作成手順については、「クライアント側セキュリティ構成ファイルの作成」を参照してください。
安全なクライアント・コードをアセンブルします。
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
を生成します。クライアント・アプリケーションはこのスタブを使用して、リモート・サービス上の操作を起動します。
クライアントをコンパイルして実行します。
この項では、ユーザー名トークンを検証するための、サーバー側Webサービス・セキュリティ構成ファイルの作成方法を説明します。この例ではファイルはserverConfig.xml
と名付けられます。WebServicesAssemblerツールはこのファイルで見つかったデータを、oracle-webservices.xml
のサーバー側デプロイメント・ディスクリプタに付加します。
注意: Oracle JDeveloperを使用してWebサービスを保護する場合、セキュリティ構成はoracle-webservices.xml ファイルに対して自動的に生成されます。 |
次に、サーバー側Webサービス・セキュリティ構成ファイルの一般的な作成手順を示します。
テキスト・エディタを使用してファイルを作成します。
例4-1にserverConfig.xml
というサーバー側構成ファイルの例を示します。
XML要素を入力して、ファイルのセキュリティ構成を設定します。
次の項では、ユーザー名トークンとXML署名および暗号に対するサーバー側Webサービス・セキュリティ構成の例を説明します。
「ユーザー名トークンに対するサーバー側ポート・レベル・セキュリティ構成の定義」では、ポート・レベルでユーザー名トークン検証を実施する構成ファイルの例を説明します。
「ユーザー名トークンに対するサーバー側操作レベル・セキュリティ構成の定義」では、操作レベルでユーザー名トークン検証を実施する構成ファイルの例を説明します。
「XML署名および復号化を検証するためのサーバー側ポート・レベル・セキュリティ構成の定義」では、ポート・レベルでXML署名およびXML暗号を実装する構成ファイルの例を説明します。
「XML署名および復号化に対するサーバー側操作レベル・セキュリティ構成の定義」では、操作レベルでXML署名およびXML暗号を実装する構成ファイルの例を説明します。
ファイルを保存します。
例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サービス構成ファイルの例を示します。これは、指定された操作に対してアクセスが付与される前に、ユーザー名トークンが検証されることを意味します。行番号は参照目的で付加されているだけなので注意してください。この番号は実際のファイルには表示されません。
次の構成は例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>
設定がポート・レベルで行われるため、ポートのあらゆる操作に対してアクセスが付与される前に検証が実行される必要があります。キーストア、暗号要素および署名要素の構成の詳細は、「キーストア要素」と「署名および暗号の鍵の要素」を参照してください。行番号は参照目的で付加されているだけなので注意してください。この番号は実際のファイルには表示されません。
行番号4〜25: これらの行はポート・レベルにおけるキーストア、鍵およびインバウンド・ポリシーを設定します。キーストアおよび鍵の生成の詳細は、第3章「Webサービス・セキュリティの管理」を参照してください。
行番号6〜8: これらの行はアプリケーションでデプロイされるキーストアを示すkey-store path
属性を設定します。store-pass
属性にはキーストア・パスワードが含まれます。signature-key alias
属性は信頼できる証明書を検証するために使用されます。encryption-key alias
属性はメッセージを復号化するために使用されます。signalias/encalias
がtestks.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>
例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サービス・セキュリティ構成ファイルの一般的な作成手順を示します。
テキスト・エディタを使用してファイルを作成します。
例4-5にclientConfig.xml
というクライアント側構成ファイルの例を示します。
XML要素を入力して、ファイルのユーザー名トークン・セキュリティ構成を生成します。
次の項では、ユーザー名トークンと署名および暗号に対するクライアント側セキュリティ構成ファイルの例を説明します。
「ユーザー名トークンに対するクライアント側ポート・レベル・セキュリティ構成の定義」では、ポート・レベルで公開されるあらゆる操作にアクセスするため、ユーザー名およびパスワードが送信されることを可能にする構成ファイルの例を説明します。
「XML署名および暗号化に対するクライアント側ポート・レベル・セキュリティ構成の定義」では、メッセージ・ボディの署名および暗号化を行う構成ファイルの例を説明します。
ファイルを保存します。
例4-5 に、ポート・レベルでセキュリティを実施するクライアント側Webサービス構成ファイルの例を示します。この例では、サービスがポート・レベルで公開するあらゆる操作にアクセスするため、クライアントがユーザー名およびパスワードを送信する必要があります。行番号は参照目的で付加されているだけなので注意してください。この番号は実際のファイルには表示されません。
行番号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>
例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
です。
関連資料:
|
Application Server Controlコンソールにはユーザーおよびパスワードを作成し、それをサーバーに追加できる画面が用意されています。
関連資料: 詳細は、Application Server Controlのオンライン・ヘルプでセキュリティ・プロバイダのロールおよびユーザーの管理に関するトピックを参照してください。 |
表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の |
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プロバイダ)カスタム・プラグイン・モジュールが含まれます。 |
Basic、Digest、またはクライアント証明書(client-cert)の認証を使用することで、トランスポート・レベルのWebサービスを保護できます。Webサービスがバージョン2.1または3.0のEJBからアセンブルされた場合は、oracle-webservices.xml
デプロイメント・ディスクリプタに追加を行うことでトランスポート・レベルのWebサービスを保護できます。この項では、トランスポート・レベルで保護されたWebサービスにアクセスするための、J2SEおよびJ2EEクライアントの記述方法についても説明します。
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認証メカニズムでは、クライアントが認証のために指定するパスワードが、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セキュリティ・ガイド』を参照してください。 |
バージョン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サービスのクライアントは、保護されたサービスに対してユーザー名とパスワードを渡すように、次のいずれかの方法で構成できます。
静的: orion-ejb-jar.xml
またはorion-web.xml
ファイルなどの固有デプロイメント・ディスクリプタに構成パラメータを入力します。
プログラム的: 保護されたWebサービスにアクセス可能なクライアントの記述については、「ユーザー名とパスワードを要求する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>
要素で示されます。
WebサービスがHTTP認証またはWS-Securityユーザー名トークン認証により保護されている場合、メッセージを渡すにはクライアントはユーザー名およびパスワードを入力する必要があります。
次の項では、HTTP認証またはWS-Securityユーザー名トークン認証で保護されたWebサービスにアクセスするためにJ2SEまたはJ2EEクライアントが使用できるプロパティおよびフィールド値について説明します。また、クライアントがプラグラムにおいて、または静的構成の一部として使用可能なこれらのプロパティおよび値の作成方法も説明します。
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の場合、Webサービス・クライアントは、スタブ・フィールド値を使用してユーザー名とパスワードを渡すことができます。次の項では、これらのスタブ・フィールド値の使用方法について説明します。
Stub.USERNAME_PROPERTY
Stub.PASSWORD_PROPERTY
ユーザー名およびパスワード値をクライアントに対してプログラム的に渡すには、Javaプロパティ(javax.xml.rpc.Stub.USERNAME_PROPERTY
、PASSWORD_PROPERTY
、javax.xml.rpc.Call.USERNAME_PROPERTY
およびPASSWORD_PROPERTY
)を使用できます。
次の2つは、HTTP認証およびWS-Securityユーザー名トークン認証の例です。例では、クライアントに対しユーザー名とパスワードを渡します。ユーザー名とパスワードは生成されたWebサービス・クライアント・ファイルの1つに追加されます。このファイルは<service>SoapHttp_Stub.java
といいます。この方法はJ2EE Webサービス・クライアントでのみ使用できます。
次の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ユーザー名トークンの場合、まずクライアントにトークンのサポートを生成する必要があります。クライアントをWebServicesAssemblerのgenProxy
コマンドでアセンブルするときに、ddFileName
引数とともにクライアント構成ファイルを指定します。クライアント構成ファイルでユーザー名トークン認証を有効化します。例4-9はgenProxy
コマンドのサンプルを示しています。
例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>
要素があることに注意してください。プログラム的に指定されるため、トークンのためにusername
とpassword
属性を指定する必要はありません。
例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サービス・クライアントで使用できます。
Webサービスにアクセスするには、デプロイメント・ディスクリプタでユーザー名およびパスワードを渡します。そのためには、サービスのorion-*.xml
ファイルにある<service-ref-mapping>
要素を手動で編集する必要があります。
静的クライアント・プロキシでサービス・エンドポイントにアクセスする場合は、<stub-property>
下位要素を<service-ref-mapping>
要素に追加します。Dynamic Invocation Interface(DII)を使用してサービス・エンドポイントを動的に起動する場合は、かわりに<call-property>
要素を追加します。
関連資料:
|
<service-ref-mapping>
句と、<call-property>
および<stub-property>
要素に指定する値の編集手順を次に示します。
Webサービスに対して該当するorion-*.xml
デプロイメント・ディスクリプタの<service-ref-mapping>
要素を編集します。
クライアント・プロキシを使用する場合は、ユーザー名およびパスワードに対する<stub-property>
下位要素を入力します。
サービス・エンドポイントを動的に起動する場合は、<call-property>
下位要素を入力します。
ステップ1で入力したstub-
またはcall-property
要素の<name>
および<value>
下位要素に、ユーザー名プロパティjavax.xml.rpc.security.auth.username
とその値を指定します。
ステップ1で入力したstub-
またはcall-property
要素の<name>
および<value>
下位要素に、ユーザー名プロパティjavax.xml.rpc.security.auth.password
とその値を指定します。
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ユーザー名トークンの場合、クライアントにトークンのサポートを生成します。クライアントをWebServicesAssemblerのgenProxy
コマンドでアセンブルするときに、ddFileName
引数とともにクライアント構成ファイルを指定します。例4-13はgenProxy
コマンドのサンプルを示しています。
例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>
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のセキュリティの構成」を参照してください。 |
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サービス・アセンブリ: Webサービスをアセンブルします。このコマンドはWAR、EAR、EJB JARなどの、デプロイ可能なアーカイブの作成に必要なファイルすべてを作成します。
WSDL管理: WSDLにおける処理(ボトム・アップ開発に対するWSDL生成など)を実行し、そのコンテンツおよび場所を管理し、WebServicesAssemblerで処理可能かどうかを決定します。
Java生成: WSDL、プロキシ/スタブまたはJAX-RPCの値タイプ・クラスからJavaインタフェースを作成するためのコードを生成します。
デプロイメント・ディスクリプタ生成: EAR、WAR、またはEJB JARに対するデプロイメント・ディスクリプタを生成します。
情報: WebServicesAssemblerコマンドの短い説明とツールのバージョン番号を返します。
サーバー上で、ユーザーはユーザー名(プレーン・テキストまたはダイジェスト)、SAMLまたはX.509セキュリティ・トークンから認証済ユーザーの名前を取得できます。この情報は、ユーザーがその他のサーバー・リソースへのアクセスを許可される前の、追加的な検証チェックに使用できます。この項では、AccessControlContext
およびServiceLifeCycle
のAPIによるユーザーIDの取得について説明します。
java.security.AccessControlContext
、java.security.AccessController
およびjavax.security.auth.Subject
クラスのメソッドを使用して、認証済サブジェクトを取得できます。
関連資料: この項で説明するクラスおよびメソッドの詳細は、次のWebサイトで |
注意: 認証済サブジェクトを取得する目的の1つは、JAAS Provider認証の実行です。「WebサービスにおけるJAAS Provider認証の実行」で、Webサービスにおけるこの認証タイプの実行の概要を説明します。 |
次に、AccessController
オブジェクトからの認証済サブジェクトの一般的な取得手順を示します。
AccessController.getContext
メソッドをコールしてAccessControlContext
オブジェクトを作成します。getContext
メソッドは現在のコール中コンテキストのスナップショットを取得して、それをAccessControlContext
オブジェクトに返します。
Subject.getSubject
メソッドを使用してコンテキストのサブジェクトを取得します。
例4-15に、AccessControlContext
、AccessController
およびSubject
のAPIを使用した認証済ユーザーの名前の取得を示します。
ユーザーはjavax.xml.rpc.server.ServiceLifecycle
およびServletEndpointContext
インタフェースを使用して、SAML、ユーザー名またはX.509セキュリティ・トークンからユーザー情報を取得できます。たとえば、ServletEndpointContext.getUserPrincipal
メソッドは認証済ユーザーの名前を返し、ServletEndpointContext.isUserInRole
メソッドはユーザーが特定のロールに属すかどうかを返します。
関連資料:
|
Webサービスからユーザー情報を取得するには、次の手順に従います。
Webサービスに対してServiceLifecycle
インタフェースを実装します。
ServiceLifecycle.init
メソッドの実装で、context
パラメータをServletEndpointContext
にキャストします。
ServletEndpointContext
context
パラメータでgetUserPrincipal
やisUserInRole
などのメソッドをコールしてユーザー情報を取得します。
例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; } }
OracleAS Web Servicesには、非常にスケーラブルなJava Authentication and Authorization Service(JAAS)プロバイダであるOracleAS JAAS Providerが付属しています。OracleAS Web Servicesは、保護対象リソースに対する詳細なアクセス制御を実施するJAAS認証を使用してリソースを保護できます。
次に、WebサービスにおけるJAAS認証の一般的な実行手順を示します。
セキュリティ・トークンから認証済サブジェクトを取得します。
認証済サブジェクトの取得の詳細は、「AccessControlContext APIによる認証済サブジェクトの取得」を参照してください。
認証済サブジェクトを使用して、checkPermission
などのJAAS認証コールを発行します。
関連資料: JAAS Provider認証の詳細は、『Oracle Containers for J2EEセキュリティ・ガイド』を参照してください。 |
安全なメッセージ機能などの基本タスクから、サービス指向アーキテクチャの安全な実装などのより複雑なプロジェクトにいたるまでの強固なセキュリティ・アプリケーションの開発に必要とされる、暗号的な構築ブロックがOracle Security Developer Tools(OSDT)によって提供されます。このツールは暗号化、公開鍵インフラストラクチャ、Webサービス・セキュリティおよびフェデレーテッドID管理の中核的基盤を基礎としています。
関連資料: OSDTのリファレンス・ガイドおよびJavadocは次のWebサイトにあります。
|
第5章「安全なWebサービスの使用例」で、セキュリティをWebサービスに統合する様々な方法を示すいくつかの使用例を説明します。