構成用ポリシー・セットを使用しなくても、Web Services Security API (WSS API) を使用することで SOAP メッセージをセキュアにすることができます。 クライアント・サイド要求の ジェネレーター・バインディング・セクションでシグニチャー情報を構成するには、 WSSSignature API を使用します。WSSSignature API は、com.ibm.websphere.wssecurity.wssapi.signature パッケージに 含まれています。
署名情報を使用可能にするには、WSS API を使用するか、管理コンソールから ポリシー・セットを構成します。SOAP メッセージを保護するためには、以下のシグニチャー・タスクを実行する必要があります。
WebSphere Application Server は、デフォルト・ジェネレーターの 署名情報を使用してメッセージ・パーツに署名し、RSA-SHA1、HMAC-SHA1 など既存の アルゴリズムで XML デジタル・シグニチャーを使用します。
XML Signature は、鍵情報を記述するための多くのメソッドを定義し、 新規メソッドの定義を使用可能にします。XML Signature を 使用するときには、たいていの場合、XML 正規化 (C14N) が必要になります。情報は、シリアライズされた XML 文書内で、さまざまな方法で表すことができます。 C14N プロセスは、XML 情報を正規化するために使用されます。正規化される情報が このアルゴリズムに依存するため、該当する C14N アルゴリズムを 選択します。
署名情報は、生成されるメッセージに適用する 保全性制約を指定します。この制約には、 生成メッセージ内のどのメッセージ・パーツにデジタル署名を入れる必要があるのかを指定すること、 デジタル署名済みの Nonce およびタイム・スタンプ・エレメントが付加されるメッセージ・パーツを 指定することが含まれます。以下のシグニチャーおよび関連のあるシグニチャー・パーツ情報が 構成されます。
シグニチャー・パーツ | 説明 |
---|---|
keyword | キーワードを使用してシグニチャー・パーツを追加します。シグニチャー・パーツには
次のキーワードを使用します。
|
xpath | XPath 式によってシグニチャー・パーツを追加します。 |
part | WSSSignPart オブジェクトをシグニチャー・パーツのターゲットとして 追加します。 |
timestamp | WSSTimestamp オブジェクトをシグニチャー・パーツのターゲットとして 追加します。タイム・スタンプ情報を指定すると、メッセージの生成日時とその有効期限も 指定されます。 |
header | ヘッダー (QName で指定) をシグニチャー・パーツのターゲットとして 追加します。 |
securityToken | SecurityToken オブジェクトをシグニチャー・パーツのターゲットとして 追加します。 |
署名情報については、特定のデフォルトの動作が発生します。WSSSignature API を 使用する最も簡単な方法は、デフォルトの動作を使用することです (コード例を 参照してください)。署名方式、正規化方式、セキュリティー・トークン参照、 およびシグニチャー・パーツでは、デフォルト値は WSS API によって 定義されます。
シグニチャーの決定項目 | デフォルトの動作 |
---|---|
使用するキーワード | キーワードを設定します。WebSphere Application Server は
デフォルトで以下のキーワードをサポートします。
|
使用するシグニチャー方式 | シグニチャー・アルゴリズムを設定します。デフォルトのシグニチャー方式は
RSA SHA1 です。WebSphere Application Server は、以下の事前構成されたシグニチャー方式をサポートします。
|
使用する正規化方式 | 正規化アルゴリズムを設定します。デフォルトの
正規化方式は EXC C14N です。WebSphere Application Server は、
以下の事前構成の正規化方式をサポートします。
|
シグニチャー確認が必要かどうか | シグニチャーの確認が必要かどうかを設定します。デフォルト値は false です。シグニチャー確認は、 OASIS Web Services Security バージョン 1.1 仕様で定義されます。必要な場合、 シグニチャー確認の値は保管され、応答メッセージでシグニチャー確認を生成した メッセージを受信した後で、シグニチャー確認の検証を行う際に 使用されます。この方式は要求側のためのものです。 |
使用するセキュリティー・トークン | SecurityToken を設定します。トークン・タイプで、メッセージの署名および妥当性検査に使用するトークンのタイプを指定します。 デフォルトの トークン・タイプは X.509 トークンです。 WebSphere Application Server は、 次の事前構成済みコンシューマー・トークン・タイプを提供します。
必要に応じてカスタム・トークン・タイプを作成することもできます。 |
設定するトークン参照 | refType を設定します。トークン参照のタイプのデフォルト値は SecurityToken.REF_STR です。WebSphere Application Server は、
以下の事前構成済みトークン参照タイプをサポートしています。
|
WSSSignature.requireSignatureConfirmation() が呼び出されると、 WSSSignature API は、応答メッセージにシグニチャー確認が組み込まれていると 予想します。
次の例は、WSSignature API で定義されるメソッドを 使用したサンプル・コードです。
// Get the message context Object msgcontext = getMessageContext(); // Generate the WSSFactory instance (step: a) WSSFactory factory = WSSFactory.getInstance(); // Generate the WSSGenerationContext instance (step: b) WSSGenerationContext gencont = factory.newWSSGenerationContext(); // Generate the callback handler X509GenerateCallbackHandler callbackHandler = new X509GenerateCallbackHandler( "", "dsig-sender.ks", "jks", "client".toCharArray(), "soaprequester", "client".toCharArray(), "CN=SOAPRequester, OU=TRL, O=IBM, ST=Kanagawa, C=JP", null); // Generate the security token to be used for the signature (step: c) SecurityToken token = factory.newSecurityToken(X509Token.class, callbackHandler); // Generate the WSSSignature instance (step: d) WSSSignature sig = factory.newWSSSignature(token); // Set the part to be signed (step: e) // DEFAULT: WSSSignature.BODY, WSSSignature.ADDRESSING_HEADERS, // and WSSSignature.TIMESTAMP. // Set the part in the SOAP Header specified by QName (step: e) sig.addSignHeader(new QName("http://www.w3.org/2005/08/addressing", "MessageID")); // Set the part specified by the keyword (step: e) sig.addSignPart(WSSSignature.BODY); // Set the part specified by SecurityToken (step: e) UNTGenerateCallbackHandler untCallbackHandler = new UNTGenerateCallbackHandler("Chris", "sirhC"); SecurityToken unt = factory.newSecurityToken(UsernameToken.class, untCallbackHandler); sig.addSignPart(unt); // Set the part specified by WSSSignPart (step: e) WSSSignPart sigPart = factory.newWSSSignPart(); sigPart.setSignPart(WSSSignature.TIMESTAMP); sigPart.setDigestMethod(WSSSignPart.SHA256); sig.addSignPart(sigPart); // Set the part specified by WSSTimestamp (step: e) WSSTimestamp timestamp = factory.newWSSTimestamp(); sig.addSignPart(timestamp); // Set the part specified by XPath expression (step: e) StringBuffer sb = new StringBuffer(); sb.append("/*[namespace-uri()='http://schemas.xmlsoap.org/soap/envelope/' and local-name()='Envelope']"); sb.append("/*[namespace-uri()='http://schemas.xmlsoap.org/soap/envelope/' and local-name()='Body']"); sb.append("/*[namespace-uri()='http://xmlsoap.org/Ping' and local-name()='Ping']"); sb.append("/*[namespace-uri()='http://xmlsoap.org/Ping' and local-name()='Text']"); sig.addSignPartByXPath(sb.toString()); // Set to apply the signature confirmation (step: f) sig.requireSignatureConfirmation(); // Set the canonicalization method (step: g) // DEFAULT: WSSSignature.EXC_C14N sig.setCanonicalizationMethod(WSSSignature.C14N); // Set the signature method (step: h) // DEFAULT: WSSSignature.RSA_SHA1 sig.setSignatureMethod(WSSSignature.HMAC_SHA1); // Set the token reference (step: i) // DEFAULT: SecurityToken.REF_STR sig.setTokenReference(SecurityToken.REF_KEYID); // Add the WSSSignature to WSSGenerationContext (step: j) gencont.add(sig); // Generate the WS-Security header (step: k) gencont.process(msgctx);
デフォルト値とは別のアルゴリズム方式を使用する場合は、 次にアルゴリズム方式を選択します。アルゴリズム方式を変更する 必要がない場合は、次に WSSVerification API を使用してシグニチャーを検証し、 バインディングのコンシューマー・セクションでアルゴリズム方式を指定します。WSSVerification API は、 応答コンシューマー (クライアント・サイド) でしかサポートされていません。