WSS API を使用したジェネレーター・セキュリティー・トークンの構成

ポリシー・セットを使用しなくても、Web Services Security API を使用することで SOAP メッセージをセキュアにすることができます。 ジェネレーター側にトークンを構成するには、 Web Services Security API (WSS API) を使用します。 ジェネレーター・セキュリティー・トークンは、 com.ibm.websphere.wssecurity.wssapi.token インターフェース・パッケージの一部です。

始める前に

WebSphere® Application Server の プラグ可能トークン・フレームワークが設計変更され、 WSS API の同一フレームワークを再利用できるようなりました。セキュリティー・トークンの作成および妥当性検査の実装と同じものを、 Web Services Security ランタイムと WSS API アプリケーション・コードの両方に使用できます。 再設計されたフレームワークにより、SPI プログラミング・モデルもシンプルになり、 セキュリティー・トークン・タイプの追加が容易になります。

WSS API を使用することも、管理コンソールを使用してトークンを構成することもできます。 トークンを構成するには、以下のトークン・タスクを実行する必要があります。

  • ジェネレーター・トークンを構成します。
  • コンシューマー・トークンを構成します。

このタスクについて

ジェネレーター側で、JAAS CallbackHandler と JAAS LoginModule は、 セキュリティー・トークンを作成する責務を担います。

ジェネレーター側では、 トークンは JAAS LoginModule を使用して作成され、JAAS CallbackHandler を使用して認証データを受け渡します。 次に、JAAS LoginModule は UsernameToken などの securityToken オブジェクトを作成して、それを Web Services Security ランタイムに受け渡します。

コンシューマー側では、 XML フォーマットが妥当性検査または認証用 JAAS LoginModule に受け渡されます。 次に、JAAS CallbackHandler を使用して、認証データが Web Services Security ランタイムから LoginModule に受け渡されます。トークンが認証された後、セキュリティー・トークン・オブジェクトが作成され、そのトークンが Web Services Security ランタイムに受け渡されます。

ジェネレーター・トークンの作成に WSS API を使用すると、 ある決まったデフォルトの動作が行われます。 WSS API を使用する一番簡単な方法は、デフォルトの動作を使用することです (サンプル・コードを参照)。 WSS API は、トークン・タイプ、トークン値、および JAAS 構成名のデフォルト値を提供します。 デフォルト・トークンの動作は、以下のとおりです。

表 1. トークン決定およびデフォルトの動作. いくつかのトークン特性は、デフォルトで構成されます。
ジェネレーター・トークンの決定 デフォルトの動作
使用するトークン・タイプ

トークン・タイプで、メッセージの保全性、メッセージの機密性、またはメッセージの認証性に使用するトークンのタイプを指定します。

WebSphere Application Server は、メッセージの保全およびメッセージの機密保護のために、以下の事前定義された ジェネレーター・トークン・タイプを提供します。
  • 派生鍵トークン
  • X509 トークン
必要に応じて、カスタム・トークン・タイプを作成することもできます。

WebSphere Application Server は、メッセージの認証のために、以下の事前定義されたジェネレーター・トークン・タイプを提供します。

  • ユーザー名トークン
  • LTPA トークン
  • X509 トークン

必要に応じて、カスタム・トークン・タイプを作成することもできます。

指定する JAAS ログイン構成名

JAAS ログイン構成名で、使用する JAAS ログイン構成名を指定します。

使用する構成タイプ JAAS ログイン・モジュールは構成タイプを指定します。 ジェネレーター・トークン・タイプには、事前定義されたジェネレーター構成タイプのみを使用できます。

SecurityToken クラス (com.ibm.websphere.wssecurity.wssapi.token.SecurityToken) は、 汎用トークン・クラスであり、識別名、XML フォーマット、および暗号鍵を取得するための方式が含まれているセキュリティー・トークンを表します。 SecurityToken クラスを使用して、シグニチャーと暗号化の両方を SOAP メッセージに適用することができます。 ただし、両方を適用するには、シグニチャー用と暗号化用にそれぞれ 1 つずつ、合計 2 つの SecurityToken オブジェクトが必要です。

以下のトークン・タイプは汎用セキュリティー・トークン・クラスのサブクラスです。

表 2. SecurityToken のサブクラス. これらのサブクラスを使用して、セキュリティー・トークンを表します。
トークン・タイプ JAAS ログイン構成名
ユーザー名トークン system.wss.generate.unt
セキュリティー・コンテキスト・トークン system.wss.generate.sct
派生鍵トークン system.wss.generate.dkt

以下のトークン・タイプはバイナリー・セキュリティー・トークン・クラスのサブクラスです。

表 3. BinarySecurityToken のサブクラス. これらのサブクラスを使用して、バイナリー・セキュリティー・トークンを表します。
トークン・タイプ JAAS ログイン構成名
LTPA トークン system.wss.generate.ltpa
LTPA 伝搬トークン system.wss.generate.ltpaProp
X.509 トークン system.wss.generate.x509
X.509 PKI Path トークン system.wss.generate.pkiPath
X.509 PKCS7 トークン system.wss.generate.pkcs7
注:
  • JAAS ログイン・トークン生成プログラムの構成名ごとに、 それぞれのトークン・コンシューマーの構成名があります。 例えば、Username トークンの場合、 そのトークン・コンシューマーの構成名は system.wss.consume.unt です。
  • LTPA および LTPA の伝搬トークンは、サーバー・ベースのクライアントとして実行されている要求側のみが使用できます。 LTPA および LTPA の伝搬トークンは、 Java™ SE 6 または Java EE アプリケーション・クライアントではサポートされません。

手順

  1. securityToken パッケージ com.ibm.websphere.wssecurity.wssapi.token を構成するには、 最初に、アプリケーション・サーバーがインストールされていることを確認します。
  2. Web Services Security トークン生成プログラム・プロセスを使用して、 トークンを構成します。 各トークン・タイプのプロセスは、UsernameToken トークン生成プログラム・プロセスを表す 以下のプロセスに類似しています。
    1. WSSFactory.getInstance() を使用して WSS API 実装インスタンスを取得します。
    2. WSSFactory インスタンスから WSSGenerationContext インスタンスを作成します。
    3. JAAS CallbackHandler を作成します。 ユーザー名やパスワードなどの認証データは、CallbackHandler の一部として指定します。 例えば、以下のコードでは、ユーザー名として Chris を指定し、パスワードして sirhC を指定しています。 UNTGenerationCallbackHandler("Chris", "sirhC");
    4. すべての JAAS CallbackHandler パラメーターを呼び出し、 トークン・クラス情報を調べて、どのパラメーターが必須でどのパラメーターがオプションであるのかを確認します。 例えば、UsernameToken の場合、以下のパラメーターも構成できます。
      nonce
      トークン生成プログラムのユーザー名トークンに nonce を組み込むかどうかを示します。 nonce はメッセージに組み込まれた固有の暗号数値であり、 ユーザー名トークンの、繰り返される未許可の攻撃を防ぐのに役立ちます。 nonce 値が有効であるのは、 生成されたトークン・タイプが UsernameToken である場合と、要求生成プログラム・バインディングに適用できる場合に限られます。
      作成タイム・スタンプ
      UsernameToken にタイム・スタンプを挿入するかどうかを示します。 タイム・スタンプ値が有効であるのは、 生成されたトークン・タイプが UsernameToken である場合と、要求生成プログラム・バインディングに適用できる場合に限られます。
    5. WSSFactory から SecurityToken を作成します。

      デフォルトでは、UsernameToken API で、ValueType を http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#UsernameToken と指定します。

      デフォルトでは、UsernameToken API は、このクラスの QName を指定し、 NamespaceURI を http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd と指定し、さらに LocalPart を UsernameToken と指定します。

    6. オプション: JAAS ログイン・モジュール構成名を指定します。 ジェネレーター側では、構成タイプは常に generate (例えば、 system.wss.generate.unt) です。
    7. SecurityToken を WSSGenerationContext に追加します。
    8. WSSGenerationContext.process() を呼び出し、WS-Security ヘッダーを生成します。

タスクの結果

エラー条件がある場合は、WSSException が発生します。正常な場合、 WSSGenerationContext process() が呼び出され、ジェネレーター・バインディングのセキュリティー・トークンが関連付けられます。

以下のサンプル・コードで、WSS API を使用して Username セキュリティー・トークンを作成し、Username トークンを SOAP メッセージに添付し、Username トークンをジェネレーター・バインディングで構成する方法を示します。

// import the packages
import javax.xml.ws.BindingProvider;
import com.ibm.websphere.wssecurity.wssapi.*;
import com.ibm.websphere.wssecurity.callbackhandler.*;
...
   // obtain the binding provider
   BindingProvider bp = ... ;

   // get the request context
   Map<String, Object> reqContext = bp.getRequestContext();

   // generate WSSFactory instance
   WSSFactory factory = WSSFactory.getInstance();

   // generate WSSGenerationContext instance
   WSSGenerationContext gencont = factory.newWSSGenerationContext();

   // generate callback handler
   UNTGenerateCallbackHandler untCallbackHandler =
   	         new UNTGenerateCallbackHandler("Chris", "sirhC");		

   // generate the username token 
   SecurityToken unt = factory.newSecurityToken(UsernameToken.class, untCallbackHandler);

   // add the SecurityToken to the WSSGenerationContext
   gencont.add(unt);

   // generate the WS-Security header
   gencont.process(reqContext);
以下のサンプル・コードで、前の Username トークン・サンプルを変更して、現在のスレッド上の runAs ID から LTPAv2 トークンを作成する方法を示します。コールバック・ハンドラーをインスタンス化し、セキュリティー・トークンを作成する 2 行のコードを、次の 2 行のコードで置き換えます。
// generate callback handler
LTPAGenerateCallbackHandler ltpaCallbackHandler = new LTPAGenerateCallbackHandler(null, null);

// generate the LTPAv2 token 
SecurityToken ltpa = wssfactory.newSecurityToken(LTPAv2Token.class, ltpaCallbackHandler);

(null, null) を指定した LTPAGenerateCallbackHandler オブジェクトのインスタンス化は、LTPA トークンを現在の runAs ID から生成する必要があることを示します。basicAuth 情報 ("userName", "password") を使用してコールバック・ハンドラーをインスタンス化した場合は、指定した basicAuth 情報を使用して、新規 LTPA トークンが作成されます。

以下の例は、WSS API とのセキュアな会話を使用して、ジェネレーター・トークンおよびコンシューマー・トークンを構成する方法を示しています。この例では、WS-SecureConversation ドラフト名前空間 http://schemas.xmlsoap.org/ws/2005/02/sc/sct を使用して、SecurityContextToken トークンが作成されます。 WS-SecureConversation バージョン 1.3 名前空間 http://docs.oasis-open.org/ws-sx/ws-secureconversation/200512/sct を使用するには、SecurityContextToken.class ではなく SecurityContextToken13.class を指定します。
// import the packages
import javax.xml.ws.BindingProvider;
import com.ibm.websphere.wssecurity.wssapi.*;
import com.ibm.websphere.wssecurity.callbackhandler.*;
...
   // obtain the binding provider
   BindingProvider bp = ... ;

   // get the request context
   Map<String, Object> reqContext = bp.getRequestContext();

   // generate WSSFactory instance
   WSSFactory wssFactory = WSSFactory.getInstance();

   WSSGenerationContext bootstrapGenCon = wssFactory.newWSSGenerationContext();

   // Create a Timestamp
   ...
   // Add Timestamp
   ...

   		// Sign the SOAP Body, WS-Addressing headers, and Timestamp
   X509GenerateCallbackHandler btspReqSigCbHandler = new X509GenerateCallbackHandler(...);
   SecurityToken btspReqSigToken = wssFactory.newSecurityToken(X509Token.class,
                                                               btspReqSigCbHandler);
   		WSSSignature bootstrapReqSig = wssFactory.newWSSSignature(btspReqSigToken);
   		bootstrapReqSig.setCanonicalizationMethod(WSSSignature.EXC_C14N);

   // Add Sign Parts
   ...
   bootstrapGenCon.add(bootstrapReqSig);

   		// Encrypt the SOAP Body and the Signature
   X509GenerateCallbackHandler btspReqEncCbHandler = new X509GenerateCallbackHandler(...);
   		SecurityToken btspReqEncToken = wssFactory.newSecurityToken(X509Token.class, btspReqEncCbHandler);
   		WSSEncryption bootstrapReqEnc = wssFactory.newWSSEncryption(btspReqEncToken);
   		bootstrapReqEnc.setEncryptionMethod(WSSEncryption.AES128);
   		bootstrapReqEnc.setKeyEncryptionMethod(WSSEncryption.KW_RSA15);

   // Add Encryption parts
   ...
   bootstrapGenCon.add(bootstrapReqEnc);
   WSSConsumingContext bootstrapConCon = wssFactory.newWSSConsumingContext();
   X509ConsumeCallbackHandler btspRspVfyCbHandler = new X509ConsumeCallbackHandler(....);
   WSSVerification bootstrapRspVfy = wssFactory.newWSSVerification(X509Token.class, btspRspVfyCbHandler);
   bootstrapRspVfy.addAllowedCanonicalizationMethod(WSSVerification.EXC_C14N);

   // Add Verify parts
   ...
   bootstrapConCon.add(bootstrapRspVfy);
   X509ConsumeCallbackHandler btspRspDecCbHandler = new X509ConsumeCallbackHandler(...);
   WSSDecryption bootstrapRspDec = wssFactory.newWSSDecryption(X509Token.class, btspRspDecCbHandler);
   bootstrapRspDec.addAllowedEncryptionMethod(WSSDecryption.AES128);
   		bootstrapRspDec.addAllowedKeyEncryptionMethod(WSSDecryption.KW_RSA15);

   // Add Decryption parts
   ...
   bootstrapConCon.add(bootstrapRspDec);
   SCTGenerateCallbackHandler sctgch = new SCTGenerateCallbackHandler(bootstrapGenCon,
                                                                      bootstrapConCon,
                                                                      					ENDPOINT_URL, WSSEncryption.AES128);
   SecurityToken[] scts = wssFactory.newSecurityTokens(new Class[]{SecurityContextToken.class}, sctgch);
   SecurityContextToken sct = (SecurityContextToken)scts[0];

   // Use the SCT to generate DKTs for Secure Conversation
   // Signature algorithm and client and service labels
   DerivedKeyToken dktSig = sct.getDerivedKeyToken(WSSSignature.HMAC_SHA1,
                                                   "WS-SecureConversation",
                                                   "WS-SecureConversation");

   // Encryption algorithm and client and service labels
   DerivedKeyToken dktEnc = sct.getDerivedKeyToken(WSSEncryption.AES128,
                                                   "WS-SecureConversation",
                                                   "WS-SecureConversation");

   // Create the application generation context for the request message
   		WSSGenerationContext applicationGenCon = wssFactory.newWSSGenerationContext();

   // Create and add Timestamp
   ...

   // Add the derived key token and Sign the SOAP Body and WS-Addressing headers
   		WSSSignature appReqSig = wssFactory.newWSSSignature(dktSig);
   		appReqSig.setSignatureMethod(WSSSignature.HMAC_SHA1);
   		appReqSig.setCanonicalizationMethod(WSSSignature.EXC_C14N);
   ...
   		applicationGenCon.add(appReqSig);

   // Add the derived key token and Encrypt the SOAP Body and the Signature
   		WSSEncryption appReqEnc = wssFactory.newWSSEncryption(dktEnc);
   		appReqEnc.setEncryptionMethod(WSSEncryption.AES128);
   		appReqEnc.setTokenReference(SecurityToken.REF_STR);
   		appReqEnc.encryptKey(false);
   ...
   		applicationGenCon.add(appReqEnc);

   // Create the application consuming context for the response message
   		WSSConsumingContext applicationConCon = wssFactory.newWSSConsumingContext();

   //client and service labels and decryption algorithm
   SCTConsumeCallbackHandler sctCbHandler = new SCTConsumeCallbackHandler("WS-SecureConversation",
                                                                          "WS-SecureConversation",
                                                                          WSSDecryption.AES128);

   		// Derive the token from SCT and use it to Decrypt the SOAP Body and the Signature
   		WSSDecryption appRspDec = wssFactory.newWSSDecryption(SecurityContextToken.class, sctCbHandler);
   		appRspDec.addAllowedEncryptionMethod(WSSDecryption.AES128);
   		appRspDec.encryptKey(false);
   ...
   		applicationConCon.add(appRspDec);

   // Derive the token from SCT and use it to Verify the
   // signature on the SOAP Body, WS-Addressing headers, and Timestamp
   		WSSVerification appRspVfy = wssFactory.newWSSVerification(SecurityContextToken.class, sctCbHandler);
   ...
   		applicationConCon.add(appRspVfy);
   ...
   applicationGenCon.process(reqContext);
   applicationConCon.process(reqContext);

次のタスク

トークン・タイプごとに、WSS API または管理コンソールを使用してトークンを構成します。 次に、まだ実行していない場合は、類似のコンシューマー・トークンを指定します。

ジェネレーター・トークンとコンシューマー・トークンの両方を構成している場合は、 必要に応じて、SOAP メッセージを署名するかメッセージを暗号化するかして、SOAP メッセージを引き続きセキュアにします。 SOAP メッセージをセキュアにするには、WSS API を使用することも、管理コンソールを使用することもできます。


トピックのタイプを示すアイコン タスク・トピック



タイム・スタンプ・アイコン 最終更新: last_date
http://www14.software.ibm.com/webapp/wsbroker/redirect?version=cord&product=was-nd-mp&topic=twbs_confwssgeneratortoken
ファイル名:twbs_confwssgeneratortoken.html