WSS API およびメッセージ・レベル保護を使用した、外部 STS に対する SAML sender-vouches トークンの要求

外部セキュリティー・トークン・サービス (STS) から、sender-vouches サブジェクト確認方式を使用して SAML トークンを要求することができます。SAML sender-vouches トークンを取得した後、Java™ API for XML-Based Web Services (JAX-WS) プログラミング・モデルおよび Web Services Security API (WSS API) を使用して、それらのトークンをメッセージ・レベルで保護された Web サービス要求メッセージで送信することができます。

始める前に

この作業では、JAX-WS プログラミング・モデル、WSS API インターフェース、SAML の概念、SSL トランスポート保護、X.509 セキュリティー・トークン、および Web サービスの設定を構成および管理するためのポリシー・セットの使用について、ユーザーが十分な知識を持っていることが前提になります。

このタスクについて

sender-vouches サブジェクト確認方式の SAML トークンを外部 STS に要求し、WSS API を使用して、 その SAML トークンをメッセージ・レベルで保護された Web サービス要求メッセージで Web サービス・クライアントから送信することができます。

本製品では、 sender-vouches サブジェクト確認方式の SAML トークンを必要と するデフォルト・ポリシー・セットは用意されていません。sender-vouches サブジェクト確認方式の SAML トークンを必要とする Web Services Security ポリシーの作成方法、および、カスタム・バインディング構成の作成方法について詳しくは、『SAML sender-vouches トークン用のクライアントおよびプロバイダーのバインディングの構成』をお読みください。ポリシーおよびバインディングを Web サービス・プロバイダーに関連付ける必要があります。このタスク中のコード・サンプルの前提として、Web サービス・プロバイダー・ポリシーは、SAML トークンとメッセージ本体の両方が X.509 セキュリティー・トークンを使用してデジタルに署名されていることを必要とします。

このタスクで使用される Web サービス・クライアント・アプリケーションは、ダウンロードで使用可能な JaxWSServicesSamples サンプル・アプリケーションに含まれているクライアント・コードの変更版です。 サンプルのコード例については「手順」セクションで説明します。すぐに使用できる完全な Web サービス・クライアント・サンプルが提供されています。

手順

  1. Web サービス・プロバイダーを呼び出すために使用する Web サービス・クライアントを特定し、取得します。

    このクライアントを使用して、 プログラムで WSS API を使用することによって SAML トークンを SOAP 要求メッセージに 挿入します。

    この手順で使用される Web サービス・クライアントは、JaxWSServicesSamples Web サービス・サンプル・アプリケーションに含まれるクライアント・コードの変更版です。

    サンプル Web サービス・クライアントを取得し、 プログラムで Web Services Security API を使用して SOAP 要求メッセージに SAML sender-vouches トークンを渡すように変更するには、以下のステップを実行します。

    1. JaxWSServicesSamples サンプル・アプリケーションをダウンロードします。 JaxWSServicesSamples サンプルは、デフォルトではインストールされません。
    2. JaxWSServicesSamples クライアント・コードを取得します。

      例を示すため、この手順では、JaxWSServicesSamples サンプルに含まれている Echo シン・クライアント・サンプル の変更版を使用します。 Web サービス Echo シン・クライアント・サンプル・ファイル SampleClient.java は、src¥SampleClientSei¥src¥com¥ibm¥was¥wssample¥sei¥cli ディレクトリーにあります。 サンプル・クラス・ファイルは、WSSampleClientSei.jar ファイルに含まれています。

      JaxWSServicesSamples.ear エンタープライズ・アプリケーションおよびそれをサポートする Java アーカイブ (JAR) ファイルは、JaxWSServicesSamples サンプル・アプリケーション内の installableApps ディレクトリーにあります。

    3. アプリケーション・サーバーに JaxWSServicesSamples.ear ファイルをデプロイします。 JaxWSServicesSamples.ear ファイルをデプロイしたら、サンプル Web サービス・クライアント・コードを、サンプル・アプリケーションに対してテストする準備ができたことになります。

    Web サービス・クライアント・サンプルを使用する代わりに、 ご使用の Web サービス・クライアント・アプリケーションの WSS API を使用して、プログラムで SOAP 要求メッセージの SAML トークンを渡すためにコード・スニペットを追加することもできます。この手順中の例では JAX-WS Web サービス・シン・クライアントが使用されていますが、管理対象クライアントを使用することもできます。

  2. SSL メッセージ・レベルのメッセージ保護を使用することを指定します。 以下の JVM プロパティーを使用して、STS に対する SAML トークン要求を SSL を使用して保護することを指定します。
    -Dcom.ibm.SSL.ConfigURL=file:profile_root¥properties¥ssl.client.props
    あるいは、次の例のように、サンプル・クライアント・コード内で Java システム・プロパティーを使用して、SSL 構成ファイルを定義できます。
    System.setProperty("com.ibm.SSL.ConfigURL", "file:profile_root/properties/ssl.client.props");
  3. Thin Client for JAX-WS JAR ファイルをクラスパスに追加します。 app_server_root/runtimes/com.ibm.jaxws.thinclient_8.5.0.jar ファイルをクラスパスに追加します。この JAR ファイルのクラスパスへの追加について詳しくは、『Web サービス対応クライアントのテスト』を参照してください。
  4. 外部 STS から SAML トークンを要求します。 以下のコード・スニペットは、SAML sender-vouches トークンを要求する方法を示しています。 この例では、外部 STS が、UsernameToken を受け取って検証した後で sender-vouches を使用して SAML 2.0トークンを発行するように構成されていることを前提としています。
    //Request the SAML Token from external STS
    WSSFactory factory = WSSFactory.getInstance();
    String STS_URI  = "https://externalstsserverurl:port/TrustServerWST13/services/RequestSecurityToken";
    String ENDPOINT_URL = "http://localhost:9080/WSSampleSei/EchoService";
    WSSGenerationContext gencont1 = factory.newWSSGenerationContext();
    WSSConsumingContext concont1 = factory.newWSSConsumingContext(); 
    HashMap<Object, Object> cbackMap1 = new HashMap<Object, Object>();
    cbackMap1.put(SamlConstants.STS_ADDRESS, STS_URI);
    cbackMap1.put(SamlConstants.SAML_APPLIES_TO, ENDPOINT_URL);
    cbackMap1.put(SamlConstants.TRUST_CLIENT_WSTRUST_NAMESPACE, "http://docs.oasis-open.org/ws-sx/ws-trust/200512");
    cbackMap1.put(SamlConstants.TRUST_CLIENT_COLLECTION_REQUEST, "false");
    cbackMap1.put(SamlConstants.TOKEN_TYPE, WSSConstants.SAML.SAML11_VALUE_TYPE);
    cbackMap1.put(SamlConstants.CONFIRMATION_METHOD, "sender-vouches");
    
    SAMLGenerateCallbackHandler cbHandler1 = new SAMLGenerateCallbackHandler(cbackMap1);
    
    // Add UNT to trust request
    UNTGenerateCallbackHandler utCallbackHandler = new UNTGenerateCallbackHandler("testuser", "testuserpwd");
    SecurityToken ut = factory.newSecurityToken(UsernameToken.class, utCallbackHandler);
    
    gencont1.add(ut);
    
    cbHandler1.setWSSConsumingContextForTrustClient(concont1);
    cbHandler1.setWSSGenerationContextForTrustClient(gencont1);
    SecurityToken samlToken = factory.newSecurityToken(SAMLToken.class, cbHandler1, "system.wss.generate.saml");
    
    System.out.println("SAMLToken id = " + samlToken.getId());
    1. WSSFactory newSecurityToken メソッドを使用して、 外部 STS から SAML トークンを要求する方法を指定します。
      SAML トークンを作成するため、以下のメソッドを 指定してください。
      WSSFactory  newSecurityToken(SAMLToken.class, callbackHandler, "system.wss.generate.saml")
      SAML トークンの要求には、Java セキュリティー 権限 wssapi.SAMLTokenFactory.newSAMLToken が必要です。ポリシー・ツールを 使用して、以下のポリシー・ステートメントを Java セキュリティー・ポリシー・ファイルまたは アプリケーション・クライアント was.policy ファイルに追加してください。
      permission java.security.SecurityPermission "wssapi.SAMLTokenFactory.newSAMLToken"

      SAMLToken.class パラメーター は、作成するセキュリティー・トークンのタイプを指定します。

      callbackHandler オブジェクトには、要求する SAMLToken の特性を定義するパラメーターと、 STS に到達し SAML トークンを取得するために必要なその他のパラメーターが含まれます。SAMLGenerateCallbackHandler オブジェクトは、次の表に示す構成パラメーターを指定します。
      表 1. SAMLGenerateCallbackHandler プロパティー. この表は、 sender-vouches 確認方式を使用する SAMLGenerateCallbackHandler オブジェクトの 構成パラメーターを示します。
      プロパティー 説明 必須
      SamlConstants.CONFIRMATION_METHOD sender-vouches 確認方式の使用を指定します。 はい
      SamlConstants.TOKEN_TYPE

      トークン・タイプを指定します。

      Web サービス・クライアントにポリシー・セットが関連付けられている場合、Web Services Security ランタイム環境はこのプロパティーを使用しません。

      tokenGenerator バインディング構成の valueType 属性を使用して、 トークン・タイプの値を指定します。

      この手順中の例では SAML 1.1 トークンが使用されていますが、WSSConstants.SAML.SAML20_VALUE_TYPE 値を使用することもできます。

      はい
      SamlConstants.STS_ADDRESS

      セキュリティー・トークン・サービスのアドレスを指定します。

      このタスク・トピックで使用されている例では、 このプロパティーの値は https に設定されており、 SSL を使用して SAML トークン要求を保護することを指定しています。

      STS による SAML トークン要求 を SSL を使用して保護できるようにするためには、-Dcom.ibm.SSL.ConfigURL プロパティーを設定する必要があります。

      はい
      SamlConstants.SAML_APPLIES_TO SAML トークンを使用するためのターゲット STS アドレスを指定します。 いいえ
      SamlConstants.TRUST_CLIENT_COLLECTION_REQUEST STS から要求するトークンが、 RequestSecurityToken (RST) エレメントに含まれる単一のトークンであるか、 または単一の RequestSecurityTokenCollection (RSTC) エレメントに含まれる RST エレメントの コレクション内の複数のトークンであるかを指定します。

      デフォルトの動作では、 RequestSecurityToken (RST) エレメントに含まれる単一のトークンを STS から要求します。

      このプロパティーに値 true を指定すると、 単一の RequestSecurityTokenCollection (RSTC) エレメントに含まれる RST エレメントの コレクション内の複数のトークンを STS から要求することを示します。

      いいえ
      SamlConstants.TRUST_CLIENT_WSTRUST_NAMESPACE WS-Trust 要求に組み込まれる WS-Trust 名前空間を指定します。

      デフォルト値は WSTrust 1.3 です。

      いいえ

      WSSGenerationContext インスタンスおよび WSSConsumingContext インスタンス も SAMLGenerateCallbackHandler オブジェクトに設定されています。WSSGenerationContext インスタンスには、STS に送信したい UsernameToken を作成するための情報が指定された UNTGenerateCallbackHandler オブジェクトが含まれている必要があります。

      system.wss.generate.saml パラメーターは、SAML トークンの作成に使用される Java Authentication and Authorization Service (JAAS) ログイン・モジュールを指定します。次の例のように、必要な JAAS ログイン構成を含んでいる JAAS 構成ファイルを定義するため、JVM プロパティー を指定する必要があります。
      -Djava.security.auth.login.config=profile_root/properties/wsjaas_client.conf 
      あるいは、次の例のように、 サンプル・クライアント・コード内で Java システム・プロパティー を設定することによって、JAAS ログイン構成ファイルを指定できます。
      System.setProperty("java.security.auth.login.config", "profile_root/properties/wsjaas_client.conf");
    2. 作成された SAML トークンのトークン ID を取得します。
      以下のステートメントを、作成した SAML トークンの簡単なテストとして使用できます。
      System.out.println("SAMLToken id = " + samlToken.getId())
  5. SAML トークンを、Web サービス要求メッセージの SOAP セキュリティー・ヘッダーに追加します。
    1. Web サービス・クライアントを初期化し、SOAPAction プロパティーを構成します。 以下のコード例は、これらのアクションを示しています。
      // Initialize web services client
      EchoService12PortProxy echo = new EchoService12PortProxy();
      echo._getDescriptor().setEndpoint(endpointURL);
      
      // Configure SOAPAction properties
      BindingProvider bp = (BindingProvider) (echo._getDescriptor().getProxy());
      Map<String, Object> requestContext = bp.getRequestContext();
      requestContext.put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY, endpointURL);
      requestContext.put(BindingProvider.SOAPACTION_USE_PROPERTY,	Boolean.TRUE);
      requestContext.put(BindingProvider.SOAPACTION_URI_PROPERTY, "echoOperation");
      			
      // Initialize WSSGenerationContext
      WSSGenerationContext gencont = factory.newWSSGenerationContext();
      gencont.add(samlToken);	
    2. WSSGenerationContext を初期化します。 以下のコード・スニペットは、生成コンテキストを初期化して、SAMLToken を Web サービス要求メッセージに挿入できるようにするための、WSSGenerationContext タイプの gencont.object の使用方法を示します。
      // Initialize WSSGenerationContext
      WSSGenerationContext gencont = factory.newWSSGenerationContext();
      gencont.add(samlToken);	
      具体的には、gencont.add(samlToken) メソッド呼び出し が、SAML トークンを要求メッセージに入れることを指定しています。この操作は、クライアント・コードが次の Java 2 セキュリティー権限を持っていることを必要とします。
       permission javax.security.auth.AuthPermission "modifyPrivateCredentials"
  6. Web Services Security API を使用して、メッセージ保護のために X.509 トークンを追加します。
    このサンプル・コードは、dsig-sender.ks 鍵ファイルと SOAPRequester サンプル鍵 を使用します。実稼働環境では、このサンプル鍵を使用しないでください。 以下のコード・スニペットは、メッセージ保護用の X.509 トークンの追加を 示します。
    // Add an X.509 Token for message protection
        X509GenerateCallbackHandler x509callbackHandler = new X509GenerateCallbackHandler(
            	null,
            		"profile_root/etc/ws-security/samples/dsig-sender.ks", 
            	"JKS",
            	"client".toCharArray(),
            	"soaprequester",
            	"client".toCharArray(),
            	"CN=SOAPRequester, OU=TRL, O=IBM, ST=Kanagawa, C=JP", null);
    
       SecurityToken x509 = factory.newSecurityToken(X509Token.class,
       x509callbackHandler, "system.wss.generate.x509");
    
       WSSSignature sig = factory.newWSSSignature(x509);
       sig.setSignatureMethod(WSSSignature.RSA_SHA1);
                    	
       WSSSignPart sigPart = factory.newWSSSignPart();
       sigPart.setSignPart(samlToken);
       	  sigPart.addTransform(WSSSignPart.TRANSFORM_STRT10);
       	  sig.addSignPart(sigPart);
       sig.addSignPart(WSSSignature.BODY);
    1. X509 トークンを使用する WSSSignature オブジェクトを作成します。 以下のコード行によって、X509 トークンを持つ WSSSignature オブジェクトが作成されます。
      WSSSignature sig = factory.newWSSSignature(x509);
    2. メッセージ保護のために使用する署名済みパーツを追加します。 以下のコード行は、署名済みパーツとして WSSSignature.BODY を追加することを指定 しています。
      sig.addSignPart(WSSSignature.BODY);
    3. SOAP メッセージ・セキュリティー・ヘッダーにタイム・スタンプ・エレメントを 追加します。 SAML20 SenderVouches WSHTTPS ポリシー・セットおよび SAML11 SenderVouches WSHTTPS ポリシー・セットは、Web サービス要求メッセージおよび応答メッセージが SOAP メッセージのセキュリティー・ヘッダー内にタイム・スタンプ・エレメントを含んでいることを必要とします。以下のコード・スニペットでは、factory.newWSSTimestamp() メソッド呼び出し がタイム・スタンプを生成し、gencont.add(timestamp) メソッド呼び出し がタイム・スタンプを要求メッセージに追加します。
      // Add Timestamp
      WSSTimestamp timestamp = factory.newWSSTimestamp();
         gencont.add(timestamp);
      sig.addSignPart(WSSSignature.TIMESTAMP);
                  
      gencont.add(sig);
              	
      			
      	  WSSConsumingContext concont = factory.newWSSConsumingContext();
    4. STR-Transform 変換アルゴリズムを使用して、SAML トークンの署名を設定します。
      WSSSignPart.TRANSFORM_STRT10 属性で 表される SecurityTokenReference 変換アルゴリズムを 指定するため、独立した WSSSignPart が必要です。 SAML トークンに直接的にデジタル署名することはできません。この属性は、Web Services Security ランタイム環境が、SAMLToken を参照するために SecurityTokenReference エレメントを生成することと、SecurityTokenReference 変換を使用して SAMLToken にデジタルに署名することを可能にします。次のコード行は、WSSSignPart.TRANSFORM_STRT10 属性を使用することを指定しています。
      WSSSignPart sigPart = factory.newWSSSignPart();
      sigPart.setSignPart(samlToken);
      	  sigPart.addTransform(WSSSignPart.TRANSFORM_STRT10);
    5. WSSGenerationContext オブジェクトを Web サービス RequestContext オブジェクトに関連付けます。 これで、WSSGenerationContext オブジェクト は、要求メッセージをフォーマットするのに必要なすべてのセキュリティー情報 を含んでいる状態になります。次の例のように、gencont.process(requestContext) メソッド呼び出しは WSSGenerationContext オブジェクトを Web サービス RequestContext オブジェクトに関連付けて、必要な SOAP セキュリティー・ヘッダーを Web Services Security ランタイム環境がフォーマットできるようにします。
      // Attaches the WSSGenerationContext object to the web services RequestContext object. 
      gencont.process(requestContext);
  7. X.509 トークンを使用して、デジタル署名の検証、および応答メッセージの整合性 の検証を行います。 応答メッセージがデジタル署名されていることをプロバイダー・ポリシー が必要とする場合、X.509 トークンを初期化する必要があります。
    1. X509ConsumeCallbackHandler オブジェクトが、プロバイダー・デジタル署名を検証するため、トラストストア、dsig-receiver.ks、 および証明書パス・オブジェクトで初期化されます。 以下のコード行を使用して、X509ConsumeCallbackHandler オブジェクトが初期化されます。
      X509ConsumeCallbackHandler callbackHandlerVer = new X509ConsumeCallbackHandler( 
       	        		"profile_root/etc/ws-security/samples/dsig-receiver.ks",
                "JKS",
                 "server".toCharArray(),
                  certList,
                        java.security.Security.getProvider("IBMCertPath"));
    2. Web Services Security ランタイム環境がデジタル署名を検証するよう、WSSVerification オブジェクトが作成され、メッセージ本体が検証オブジェクトに追加されます。
      以下のコード行は、WSSVerification オブジェクトを 初期化するのに使用されます。
      WSSVerification ver = factory.newWSSVerification(X509Token.class, callbackHandlerVer);
      これで、WSSConsumingContext オブジェクト は、要求メッセージをフォーマットするのに必要なすべてのセキュリティー情報 を含んでいる状態になります。次の例のように、concont.process(requestContext) メソッド呼び出し は WSSConsumingContext オブジェクトを応答メソッドに関連付けます。
      // Attaches the WSSConsumingContext object to the Web services RequestContext object.
      concont.process(requestContext);

タスクの結果

sender-vouches 確認方式の SAML トークンを外部 STS から要求しました。トークンの取得後に、JAX-WS プログラミング・モデルおよび WSS API を使用して、メッセージ・レベルで保護された Web サービス要求メッセージでトークンを送信しました。

以下のコード例は、外部 STS に SAML トークンを要求し、 その SAML トークンをメッセージ・レベルで保護された Web サービス要求メッセージで送信する方法を示す、 すぐに使用できる完全な Web サービス・クライアント・アプリケーションです。このサンプル・コードは、上記の手順を 示しています。

/**
 * The following source code is sample code created by IBM Corporation.  
 * This sample code is provided to you solely for the purpose of assisting you in the  
 * use of the technology.  The code is provided 'AS IS', without warranty or condition of 
 * any kind.  IBM shall not be liable for any damages arising out of your use of the 
 * sample code, even if IBM has been advised of the possibility of such damages.
 */
package com.ibm.was.wssample.sei.cli;

import com.ibm.was.wssample.sei.echo.EchoService12PortProxy;
import com.ibm.was.wssample.sei.echo.EchoStringInput;
import com.ibm.websphere.wssecurity.callbackhandler.SAMLGenerateCallbackHandler;
import com.ibm.websphere.wssecurity.callbackhandler.UNTGenerateCallbackHandler;
import com.ibm.websphere.wssecurity.wssapi.token.UsernameToken;
import com.ibm.websphere.wssecurity.wssapi.WSSConsumingContext;
import com.ibm.websphere.wssecurity.wssapi.WSSFactory;
import com.ibm.websphere.wssecurity.wssapi.WSSGenerationContext;
import com.ibm.websphere.wssecurity.wssapi.WSSTimestamp;
import com.ibm.websphere.wssecurity.wssapi.token.SAMLToken;
import com.ibm.websphere.wssecurity.wssapi.token.SecurityToken;
import com.ibm.websphere.wssecurity.callbackhandler.X509ConsumeCallbackHandler;
import com.ibm.websphere.wssecurity.callbackhandler.X509GenerateCallbackHandler;
import com.ibm.websphere.wssecurity.wssapi.WSSException;
import com.ibm.websphere.wssecurity.wssapi.signature.WSSSignPart;
import com.ibm.websphere.wssecurity.wssapi.signature.WSSSignature;
import com.ibm.websphere.wssecurity.wssapi.verification.WSSVerification;
import com.ibm.websphere.wssecurity.wssapi.token.X509Token;
import com.ibm.wsspi.wssecurity.core.token.config.WSSConstants;
import com.ibm.wsspi.wssecurity.saml.config.SamlConstants;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.InputStream;
import java.security.InvalidAlgorithmParameterException;
import java.security.NoSuchAlgorithmException;
import java.security.NoSuchProviderException;
import java.security.cert.CertStore;
import java.security.cert.CertificateException;
import java.security.cert.CertificateFactory;
import java.security.cert.CollectionCertStoreParameters;
import java.security.cert.X509Certificate;
import java.util.HashSet;
import java.util.Set;
import java.util.HashMap;
import java.util.Map;

import javax.xml.ws.BindingProvider;

public class SampleSamlSVClient {
		private String urlHost = "localhost";
		private String urlPort = "9080";
		private static final String CONTEXT_BASE = "/WSSampleSei/";
		private static final String ECHO_CONTEXT12 = CONTEXT_BASE+"EchoService12";	
		private String message = "HELLO";
		private String uriString = "http://" + urlHost + ":" + urlPort;
		private String endpointURL = uriString + ECHO_CONTEXT12;
		private String input = message;

	/**
	 	 * main()
	 * 
	 	 * see printusage() for command-line arguments
	 * 
	 * @param args
	 */
	public static void main(String[] args) {
				SampleSamlSVClient sample = new SampleSamlSVClient();
				sample.CallService();
	}

	/**
	 	 * CallService Parms were already read. Now call the service proxy classes. 
	 * 
	 */
		void CallService() {
				String response = "ERROR!:";
		try {
			    			    System.setProperty("com.ibm.SSL.ConfigURL", "profile_root/properties/ssl.client.props");
			    System.setProperty("java.security.auth.login.config", "profile_root/properties/wsjaas.conf");
			

//Request the SAML Token from external STS
WSSFactory factory = WSSFactory.getInstance();
String STS_URI  = "https://externalstsserverurl:port/TrustServerWST13/services/RequestSecurityToken";
String ENDPOINT_URL = "http://localhost:9080/WSSampleSei/EchoService";
WSSGenerationContext gencont1 = factory.newWSSGenerationContext();
WSSConsumingContext concont1 = factory.newWSSConsumingContext(); 
HashMap<Object, Object> cbackMap1 = new HashMap<Object, Object>();
cbackMap1.put(SamlConstants.STS_ADDRESS, STS_URI);
cbackMap1.put(SamlConstants.SAML_APPLIES_TO, ENDPOINT_URL);
cbackMap1.put(SamlConstants.TRUST_CLIENT_WSTRUST_NAMESPACE, "http://docs.oasis-open.org/ws-sx/ws-trust/200512");
cbackMap1.put(SamlConstants.TRUST_CLIENT_COLLECTION_REQUEST, "false");
cbackMap1.put(SamlConstants.TOKEN_TYPE, WSSConstants.SAML.SAML11_VALUE_TYPE);
cbackMap1.put(SamlConstants.CONFIRMATION_METHOD, "sender-vouches");

SAMLGenerateCallbackHandler cbHandler1 = new SAMLGenerateCallbackHandler(cbackMap1);

// Add UNT to trust request
UNTGenerateCallbackHandler utCallbackHandler = new UNTGenerateCallbackHandler("testuser", "testuserpwd");
SecurityToken ut = factory.newSecurityToken(UsernameToken.class, utCallbackHandler);

gencont1.add(ut);

cbHandler1.setWSSConsumingContextForTrustClient(concont1);
cbHandler1.setWSSGenerationContextForTrustClient(gencont1);
SecurityToken samlToken = factory.newSecurityToken(SAMLToken.class, cbHandler1, "system.wss.generate.saml");

System.out.println("SAMLToken id = " + samlToken.getId()); 
			
	        // Initialize web services client. 
			EchoService12PortProxy echo = new EchoService12PortProxy();
			echo._getDescriptor().setEndpoint(endpointURL);

			// Configure SOAPAction properties
			BindingProvider bp = (BindingProvider) (echo._getDescriptor().getProxy());
			Map<String, Object> requestContext = bp.getRequestContext();
			requestContext.put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY, endpointURL);
			requestContext.put(BindingProvider.SOAPACTION_USE_PROPERTY,	Boolean.TRUE);
			requestContext.put(BindingProvider.SOAPACTION_URI_PROPERTY, "echoOperation");
			
			// Initialize WSSGenerationContext
			WSSGenerationContext gencont = factory.newWSSGenerationContext();
	        gencont.add(samlToken);		        
	        // Add X.509 Tokens for message protection
            X509GenerateCallbackHandler x509callbackHandler = new X509GenerateCallbackHandler(
        			null,
        				"profile_root/etc/ws-security/samples/dsig-sender.ks", 
        			"JKS",
        			"client".toCharArray(),
        			"soaprequester",
        			"client".toCharArray(),
        			"CN=SOAPRequester, OU=TRL, O=IBM, ST=Kanagawa, C=JP", null);

            SecurityToken x509 = factory.newSecurityToken(X509Token.class,
            x509callbackHandler, "system.wss.generate.x509");

            WSSSignature sig = factory.newWSSSignature(x509);
            sig.setSignatureMethod(WSSSignature.RSA_SHA1);
                	
            WSSSignPart sigPart = factory.newWSSSignPart();
            sigPart.setSignPart(samlToken);
            	  sigPart.addTransform(WSSSignPart.TRANSFORM_STRT10);
            	  sig.addSignPart(sigPart);
            sig.addSignPart(WSSSignature.BODY);
            
	        // Add timestamp
	        WSSTimestamp timestamp = factory.newWSSTimestamp();
			gencont.add(timestamp);
        	sig.addSignPart(WSSSignature.TIMESTAMP);
            
        	gencont.add(sig);
        	
			
        	WSSConsumingContext concont = factory.newWSSConsumingContext();
        	
        		// Prepare to consume timestamp in response message
	     	concont.add(WSSConsumingContext.TIMESTAMP); 
	        
	     		     	// Prepare to verify digital signature in response message        	
	        X509Certificate x509cert = null;
	        try {
	                	                InputStream is = new FileInputStream("profile_root/etc/ws-security/samples/intca2.cer");
	                CertificateFactory cf = CertificateFactory.getInstance("X.509");
	                		  x509cert = (X509Certificate)cf.generateCertificate(is);
	        } catch(FileNotFoundException e1){
	                throw new WSSException(e1);
	        } catch (CertificateException e2) {
	                throw new WSSException(e2);
	        }
	        Set<Object> eeCerts = new HashSet<Object>();
	        eeCerts.add(x509cert);

	        	  java.util.List<CertStore> certList = new java.util.ArrayList<CertStore>();
	        	  CollectionCertStoreParameters certparam = new CollectionCertStoreParameters(eeCerts);

	        CertStore cert = null;
	        try {
	                		  cert = CertStore.getInstance("Collection", certparam, "IBMCertPath");
	        } catch (NoSuchProviderException e1) {
	                throw new WSSException(e1);
	        } catch (InvalidAlgorithmParameterException e2) {
	                throw new WSSException(e2);
	        } catch (NoSuchAlgorithmException e3) {
	                		  throw new WSSException (e3);
	        }
	        if(certList != null ){
	                certList.add(cert);
	        }

	        X509ConsumeCallbackHandler callbackHandlerVer = new X509ConsumeCallbackHandler(
	        			        		"profile_root/etc/ws-security/samples/dsig-receiver.ks",
	        		"JKS",
	        		"server".toCharArray(),
	        		certList,
	        		java.security.Security.getProvider("IBMCertPath"));
	        WSSVerification ver = factory.newWSSVerification(X509Token.class, callbackHandlerVer);
	        	    ver.addRequiredVerifyPart(WSSVerification.BODY);
	        concont.add(ver);
						
	        gencont.process(requestContext);	        concont.process(requestContext);	        
	        	        // Build the input object
						EchoStringInput echoParm = 
								new com.ibm.was.wssample.sei.echo.ObjectFactory().createEchoStringInput();
						echoParm.setEchoInput(input);
						System.out.println(">> CLIENT: SEI Echo to " + endpointURL);		
						
						// Call the service
						response = echo.echoOperation(echoParm).getEchoResponse();
						
						System.out.println(">> CLIENT: SEI Echo invocation complete.");
						System.out.println(">> CLIENT: SEI Echo response is: " + response);
		} catch (Exception e) {
						System.out.println(">> CLIENT: ERROR: SEI Echo EXCEPTION.");
			e.printStackTrace();
		}
	}
}
この Web サービス・クライアント・アプリケーション・サンプルが正しく実行された場合、次のようなメッセージを受け取ります。
SAMLToken id = _6CDDF0DBF91C044D211271166233407
Retrieving document at 'file:profile_root/.../wsdl/'.
>> CLIENT: SEI Echo to http://localhost:9443/WSSampleSei/EchoService12
>> CLIENT: SEI Echo invocation complete.
>> CLIENT: SEI Echo response is: SOAP12==>>HELLO

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



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