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 構成名のデフォルト値を提供します。 デフォルト・トークンの動作は、以下のとおりです。
ジェネレーター・トークンの決定 | デフォルトの動作 |
---|---|
使用するトークン・タイプ | トークン・タイプで、メッセージの保全性、メッセージの機密性、またはメッセージの認証性に使用するトークンのタイプを指定します。 WebSphere Application
Server は、メッセージの保全およびメッセージの機密保護のために、以下の事前定義された
ジェネレーター・トークン・タイプを提供します。
WebSphere Application Server は、メッセージの認証のために、以下の事前定義されたジェネレーター・トークン・タイプを提供します。
必要に応じて、カスタム・トークン・タイプを作成することもできます。 |
指定する JAAS ログイン構成名 | JAAS ログイン構成名で、使用する JAAS ログイン構成名を指定します。 |
使用する構成タイプ | JAAS ログイン・モジュールは構成タイプを指定します。 ジェネレーター・トークン・タイプには、事前定義されたジェネレーター構成タイプのみを使用できます。 |
SecurityToken クラス (com.ibm.websphere.wssecurity.wssapi.token.SecurityToken) は、 汎用トークン・クラスであり、識別名、XML フォーマット、および暗号鍵を取得するための方式が含まれているセキュリティー・トークンを表します。 SecurityToken クラスを使用して、シグニチャーと暗号化の両方を SOAP メッセージに適用することができます。 ただし、両方を適用するには、シグニチャー用と暗号化用にそれぞれ 1 つずつ、合計 2 つの SecurityToken オブジェクトが必要です。
以下のトークン・タイプは汎用セキュリティー・トークン・クラスのサブクラスです。
トークン・タイプ | JAAS ログイン構成名 |
---|---|
ユーザー名トークン | system.wss.generate.unt |
セキュリティー・コンテキスト・トークン | system.wss.generate.sct |
派生鍵トークン | system.wss.generate.dkt |
以下のトークン・タイプはバイナリー・セキュリティー・トークン・クラスのサブクラスです。
トークン・タイプ | 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 アプリケーション・クライアントではサポートされません。
手順
タスクの結果
例
以下のサンプル・コードで、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);
// 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 トークンが作成されます。
// 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 を使用することも、管理コンソールを使用することもできます。