Web Services Security API プログラミング・モデル
アプリケーション・サーバーのプログラミング・モデルは、SOAP メッセージを保護するための Web Services Security プログラミング・アプリケーション・プログラミング・インターフェース (WSS API) を提供しています。
この API プログラミング・モデルは、Web Services Security バージョン 1.1 標準に基づくインターフェース・ベースのプログラミング・モデルであり、この設計には SOAP メッセージを保護するための Web Services Security バージョン 1.0 のサポートも含まれています。 WSS API プログラミング・モデルの実装は簡素化されたバージョンで、これは Web Services Security 用の Java™ API バインディングを定義するための JSR である JSR-183 の初期ドラフト提案に基づいています。設計上、アプリケーション・コードはインターフェースに従ってプログラムされているため、オープン・ソース実装によりプログラムされたすべてのアプリケーション・コードは、最小の変更または全く変更なしで WebSphere® Application Server 上で実行できます。
Web サービスの構成モデルも、デプロイメント記述子モデルからポリシー・セット・モデルに再設計されています。Web Services Security は、管理コンソールを使用して構成されたポリシー・セットか、構成用の WSS API を使用して使用可能にできます。ポリシー設定構成により提供される機能は、Web Services Security ランタイムの WSS API によりサポートされている機能と同じです。ただし、ポリシー・セットを使用して定義されるセキュリティー・ポリシーの方が WSS API よりも優先されます。アプリケーションで WSS API とポリシー・セットの両方が使用されている場合、デフォルトの動作では、ポリシー・セットのセキュリティー・ポリシーが有効になり、WSS API は無視されます。 アプリケーションで WSS API を使用するには、そのアプリケーションまたはアプリケーション・リソースにポリシー・セットが関連付けられていないこと、あるいは関連付けられたポリシー・セットにセキュリティー・ポリシーが含まれていないことを確認する必要があります。
既存の JAX-RPC アプリケーションも、まだ Web Services Security で使用することができます。ただし、それらのアプリケーションは、ポリシー・セットを使用してセキュリティー・ポリシーを構成する、OM フィルター・パフォーマンスの改善、WSS API、Web Service Secure Conversation (WS-SecureConversation)、Kerberos トークン、メッセージ保護と ID の伝搬のための関連 SHA-1 鍵、および Web Services Trust (WS-Trust) フィーチャーなどの、新しい Web Services Security バージョン 1.1 の機能を利用できません。
Web Services Security バージョン 1.1 機能を利用するには、既存の JAX-RPC アプリケーションを JAX-WS アプリケーションとして再書き込みし、手動でセキュリティー制約をポリシー・セットに合わせて再構成し、DOM ベースの SPI から OM ベースの SPI へのコード・マイグレーションを実行する必要があります。
例えば、JAX-WS プログラミング・モデルを使用する場合、プラグ可能トークン・フレームワークの設計の設計が改善されているため、同一のセキュリティー実装を API とポリシー・セットの両方に使用することができます。このフレームワークは、JAAS Login Module と JAAS Callback Handler を、トークンの作成とトークンの検証に使用します。
次の図は、プログラミング・モデル間の相違点を示しています。


WSS API を使用する場合にサポートされる機能
WSS API はクライアント上でのみ使用できます。API を使用して Java SE 6 クライアント、J2EE アプリケーション・クライアント、またはサーバー・クライアント (クライアントとして機能するサービス・プロバイダー) を使用し、メッセージ・レベルのセキュリティーにより SOAP メッセージを保護することができます。
- WSS API は Java ベースのインターフェースです。
- WSS API はファクトリー・モデル (WSSFactory) を使用して実装されます。
- WSS API は WS-Security バージョン 1.0 および 1.1 標準をサポートしています。これには、ユーザー名トークン・プロファイルおよび X.509 トークン・プロファイルのバージョン 1.0 と 1.1 が含まれます。
- WSS API は非常に XML 中心です。
- WSS API には、API を簡素化するオブジェクト指向設計が組み込まれています。
- WSS API はタスク指向型で、本文の署名と SOAP メッセージ本文のコンテキストの暗号化など、共通のシナリオを使用できます。
- WSS API は柔軟かつ拡張可能で、トークン・タイプのサポートを拡張できます。
- WSS API はプロバイダーのフレームワークに基づいており、AXIOM や DOM など、異なるデータ・モデルを使用できます。
- WSS API はアプリケーションで WSS を適用するうえで、アプリケーション・プログラマーに対してより優れた制御および柔軟性を提供します。
WSS API のデフォルト値は事前定義されており、Web Services Security ランタイムの一部です。以下について、デフォルト値が提供されています。
- タイム・スタンプの所要時間
- 署名アルゴリズム、正規化アルゴリズム、ダイジェスト方式、変換アルゴリズム、セキュリティー・トークン参照メソッドおよび、SOAP 本体、Web Services Addressing ヘッダー、およびタイム・スタンプなどの署名部分。
- 主要な暗号化アルゴリズム、データ暗号化アルゴリズム、セキュリティー・トークン参照メソッド、および、SOAP 本体コンテキストなどの暗号化部分。
署名の検証には、署名 (署名情報) と似たデフォルト値があります。 同様に、暗号化解除には暗号化と似たデフォルト値があります。
WSS API を使用する場合にサポートされない機能
アプリケーション・サーバーで提供されている WSS API は、以下の機能をサポートしません。
- アプリケーション・プログラミング・モデルは JAX-WS です。つまり、JAX-RPC (JSR-109) アプリケーションはサポートされていません。
- WSS API は、JAX-WS クライアント・アプリケーションの同期メッセージ交換で使用できます。 ただし、WSS API は非同期クライアントについてはサポートされていません。
- WSS API のサポートは、リクエスターでのみ使用でき、プロバイダーでは使用できません。
- ID アサーションのセマンティック・プログラミング・モデルは WSS API でサポートされていません。これは、ID アサーションが Web Services Security バージョン 1.0 標準の一部ではないからです。ただし、WSS API を使用して ID アサーションの意味をトークン処理で追加することができます。
WS-Trust および WS-SecureConversation のシナリオ
- ポリシー・セットで定義されているブートストラップ・ポリシーを使用する。
- WSS API を使用する。この API は、WS-SecureConversation をサポートしています。
- クライアントが実行時にプロバイダー側のポリシーを取り出すことができるよう、プロバイダーに対して動的ポリシーを使用可能にする。
アプリケーションでは WSS API を使用して、プログラムによる API ベースのセキュアな会話用のセキュリティー・コンテキスト・トークンを取得します。 WebSphere Application Server のトラスト・サービスはアプリケーションに対して、サービスへアクセスするためのセキュリティー・トークンを要求する機能を提供します。トラスト・サービスの有効範囲および焦点は、WS-SecureConversation の WebSphere Application Server セキュリティー・コンテキスト・トークン (SCT) のみを対象としています。
WS-SecureConversation および WS-Trust のシナリオは、さまざまなコンポーネントの構成およびランタイムのやりとりなどのインターオペラビリティー機能に重点を置いています。 ユーザーは WSS API を使用してブートストラップ RST および RSTR を保護し、トラスト・サービスからセキュリティー・コンテキスト・トークンを取得します。 セキュリティー・コンテキスト・トークンを取得したら、WSS API を使用して派生鍵トークンを作成します。 その後で、派生鍵トークンを使用して署名や暗号化を行うことができます。
- 要求ジェネレーターのアプリケーション・コードでの、セキュアな SOAP メッセージの生成。
- 応答コンシューマー・アプリケーション・コードでの、セキュアな SOAP メッセージの消費。
両方の場合で、エラーが起こると Java 例外クラス com.ibm.websphere.wssecurity.wssapi.WSSException が提供されます。
Web サービス・クライアントのセキュリティー・コンテキスト
JAX-WS クライアントが Web サービスを呼び出すと、セキュリティー・ハンドラーによって構成される現在のセキュリティー・コンテキストが RequestContext オブジェクトに保管されます。デフォルトでは、JAX-WS Web サービス・クライアントのランタイム環境におけるセキュリティー・コンテキストは、次回の Web サービス要求呼び出しに備えて再構成されます。セキュリティー・コンテキストは、以降の Web サービス呼び出しに備えて保管することができます。この例としては、セキュリティー・ポリシーがクライアントに、ユーザー名セキュリティー・トークンをユーザー名とパスワードと一緒に送信するよう要求するシナリオがあります。クライアントが、最初のサービス呼び出し要求を送信すると、必要なユーザー名とパスワードの入力を求めるプロンプトが出されます。このユーザー名とパスワードは、セキュリティー・コンテキストのサブジェクト内のユーザー名の SecurityToken トークンに保存されます。以降の要求呼び出しで同じユーザー名とパスワードの再入力を求めるプロンプトが出されないようにするために、セキュリティー・コンテキストを保存しておくことができます。セキュリティー・トークンを保存するには、2 つの方法があります。1) 以降の要求呼び出しに備えて、クライアント・セキュリティー・コンテキストを自動的に保存するようクライアント・ランタイムを構成する。または、2) セキュリティー・コンテキストを手動で保存する。
セキュリティー・コンテキストを自動的に保存するよう、JAX-WS クライアントのランタイム環境を構成するには、Java システム・プロパティー com.ibm.websphere.wssecurity.context.management を true に設定します。 このシステム・プロパティーが true の場合、JAX-WS クライアントのランタイムは、セキュリティー・ハンドラーによって構成されたセキュリティー・コンテキストを RequestContext に自動的にコピーし、以降の要求呼び出しにはこのコンテキストが使用されます。
// First request
Service svc = Service.create(...);
svc.addPort(...);
Dispatch<String> dispatch = svc.createDispatch(...);
Map<String, Object> requestContext = dispatch.getRequestContext();
String response = dispatch.invoke(body.toString());
Object securityContext = requestContext.get(com.ibm.wsspi.websvcs.Constants.WEBSPHERE_SECURITY_CONTEXT);
// Subsequent request
Dispatch<String> dispatch = svc.createDispatch(...);
Map<String, Object> requestContext = dispatch.getRequestContext();
Object securityContext = requestContext.put(com.ibm.wsspi.websvcs.Constants.WEBSPHERE_SECURITY_CONTEXT, securityContext);