将 WSS API 与消息级别保护一起用于发送自签发 SAML sender-vouches 令牌

您可以创建具有 sender-vouches 主体集确认方法的自签发 SAML 令牌,随后使用 Java™ API for XML-Based Web Services (JAX-WS) 编程模型和 Web Service 安全 API (WSS API) 将这些令牌在消息级别保护下随 Web service 请求消息一起发送。

开始之前

本任务假设您熟悉 JAX-WS 编程模型、WSS API 接口、SAML 概念以及策略集的使用以配置和管理 Web service 设置。

关于此任务

您可以使用 Web service 安全编程接口以消息级别保护来保护 SOAP 请求消息和 SAML 令牌以满足 sender-vouches 主体集确认方法验证需求。使用 Web service 客户机中的编程接口是使用策略集和绑定配置的备选方法。

您可以创建自签发 SAML 令牌,然后从 Web service 客户机在 Web service 请求消息中发送 SAML 令牌。在此任务中使用的 Web service 应用程序客户机是可供下载的 JaxWSServicesSamples 样本应用程序中包含的客户机代码的已修改版本。在过程部分中描述了来自样本的代码片段,且在示例部分中提供完整的准备使用的 Web service 客户机样本。

此产品没有提供缺省策略集,该策略集需要具有 sender-vouches 主体集确认方法的 SAML 令牌。阅读关于配置 SAML sender-vouches 令牌的客户机和提供程序绑定的信息,以了解关于如何创建 Web Service 安全策略来要求具有 sender-vouches 主体集确认的 SAML 令牌以及如何创建定制绑定配置的更多信息。您必须将策略和绑定附加到 Web service 提供程序。此任务中描述的代码样本假设 Web service 提供程序策略要求使用 X.509 安全性令牌以数字方式签署 SAML 令牌和消息主体。

过程

  1. 识别并包含您要用于调用 Web service 提供程序的 Web service 客户机。

    使用此客户机来利用 WSS API 将 SAML 令牌以编程方式插入 SOAP 请求消息。

    在此过程中使用的 Web service 客户机是 JaxWSServicesSamples Web service 样本应用程序中包含的客户机代码的已修改版本。

    要获取并修改样本 Web service 客户机以添加 Web Service 安全 API 来利用 WSS API 以编程方式传递 SOAP 请求消息中的 SAML sender-vouches 令牌,请完成以下步骤:

    1. 下载 JaxWSServicesSamples 样本应用程序。 缺省情况下,未安装 JaxWSServicesSamples 样本。
    2. 获取 JaxWSServicesSamples 客户机代码。

      为了举例,此过程使用 JaxWSServicesSamples 样本中包含的 Echo 瘦客户机样本的修改版本。 Web service 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 service 客户机代码。

    您可以选择添加代码片段以利用自己的 Web service 客户机应用程序中的 WSS API 用编程方式传递 SOAP 请求消息中的 SAML 令牌,而不是使用 Web service 客户机样本。此过程中的示例使用 JAX-WS web service 瘦客户机;但是,您还可以使用受管客户机。

  2. 使用 CallService() 方法来指定 Web service 安全配置参数,需要这些参数来使用自签发 SAML 令牌调用目标 Web service 提供程序。

    CallService() 方法通过 com.ibm.websphere.wssecurity.wssapi.WSSGenerationContext 定制属性来设置 Web service 安全运行时环境所需的配置参数以生成自签发 SAML 令牌。

    以下代码片段说明使用 CallService() 方法来设置 SamlConstants.SAML_SELF_ISSUER_CONFIG 系统属性:
    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("java.security.auth.login.config", "profile_root/properties/wsjaas.conf");

    阅读关于创建令牌期间配置 SAML 令牌的信息以了解关于如何指定配置属性来控制如何配置令牌的更多信息。

  3. 将 JAX-WS JAR 文件的瘦客户机添加到类路径。app_server_root/runtimes/com.ibm.jaxws.thinclient_8.5.0.jar 文件添加到类路径。请参阅测试支持 Web Service 的客户机信息以了解关于将此 JAR 文件添加到类路径的更多信息。
  4. 创建自签发 SAML 令牌。 以下代码片段说明 SAML 令牌创建过程:
    // Create SAMLToken
    HashMap<Object, Object> map = new HashMap<Object, Object>();
    map.put(SamlConstants.CONFIRMATION_METHOD, "sender-vouches");
    map.put(SamlConstants.TOKEN_TYPE, WSSConstants.SAML.SAML20_VALUE_TYPE);
    map.put(SamlConstants.SAML_NAME_IDENTIFIER, "Alice");
    map.put(SamlConstants.SIGNATURE_REQUIRED, "true");	
    SAMLGenerateCallbackHandler callbackHandler = new SAMLGenerateCallbackHandler(map);
    SecurityToken samlToken = factory.newSecurityToken(SAMLToken.class, callbackHandler, "system.wss.generate.saml");
    System.out.println("SAMLToken id = " + samlToken.getId());
    1. 使用 WSSFactory newSecurityToken 方法来指定如何创建 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 对象包含的参数定义所创建的 SAML 令牌的特征。该对象指向 SAMLGenerateCallbackHandler 对象,该对象指定在下表中描述的以下配置参数:
      表 1. SAMLGenerateCallbackHandler 属性. 该表描述使用 sender-vouches 确认方法的 SAMLGenerateCallbackHandler 对象的配置参数。
      属性 描述 必需
      SamlConstants.CONFIRMATION_METHOD 指定来使用 sender-vouches 确认方法。
      SamlConstants.TOKEN_TYPE

      使用常量值 WSSConstants.SAML.SAML20_VALUE_TYPE 来指定 SAML 2.0 令牌类型。

      Web Service 客户机具有策略集附件时,Web Service 安全运行时环境未使用该属性。在此场景中,按 tokenGenerator 绑定配置的 valueType 属性指定令牌值类型。

      该过程中的示例使用 SAML 2.0 令牌;但是,您还可以使用 WSSConstants.SAML.SAML11_VALUE_TYPE 值。

      SamlConstants.SAML_NAME_IDENTIFIER

      将某个用户身份(例如 myname)指定为 SAML 令牌中的 NameID 值。

      如果您没有在使用 JAX-WS 的瘦客户机时定义此参数,那么 NameID 值没有包含有用的信息。

      如果您在使用 Web service 受管客户机,让 Java Platform, Enterprise Edition (Java EE) 应用程序进行 Web service 请求调用,那么 Web service 安全运行时环境尝试从安全上下文抽取用户安全信息。类似地,如果您没有为受管 Web service 客户机定义该参数,那么 NameID 值包含未经认证的名称标识。

      如果您的 Web service 客户机具有策略集附件,那么没有使用该属性。阅读关于发送 SAML 令牌的信息以了解关于发送 SAML 令牌身份和属性的更多信息。

      SamlConstants.SIGNATURE_REQUIRED

      指定是否需要签发者以数字方式签署 SAML 令牌。

      true 值指定需要签发者来以数字方式签署 SAML 令牌。 此值是缺省值。

      system.wss.generate.saml 参数指定使用 Java 认证和授权服务 (JAAS) 登录配置并指定调用来创建 SAML 令牌的登录模块。您必须指定 JVM 属性以定义 JAAS 配置文件,其包含所需的 JAAS 登录配置;例如:
      Djava.security.auth.login.config=profile_root/properties/wsjaas.conf
      或者,您可以使用样本客户机代码中的 Java 系统属性来指定 JAAS 登录配置文件;例如:
      System.setProperty("java.security.auth.login.config", "profile_root/properties/wsjaas.conf");
    2. 获取创建的 SAML 令牌的令牌标识。
      将以下语句用作对所创建的 SAML 令牌的简单测试:
      System.out.println("SAMLToken id = " + samlToken.getId())
  5. 将 SAML 令牌添加到 Web service 请求消息的 SOAP 安全头。
    1. 初始化 Web service 客户机并配置 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。 以下代码片段说明使用 WSSGenerationContext 类型的 gencont.object 来初始化生成上下文并使您可以将 SAMLToken 插入 Web service 请求消息:
      // Initialize WSSGenerationContext
      WSSGenerationContext gencont = factory.newWSSGenerationContext();
      gencont.add(samlToken);
      gencont.add(samlToken) 方法调用专门指定来将 SAML 令牌置于请求消息中。该操作要求客户机代码具有以下 Java 2 安全许可权:
       "permission javax.security.auth.AuthPermission "modifyPrivateCredentials"
  6. 添加 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 service 请求和响应消息来承载 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. 在响应消息中配置对数字签名的验证。
      需要单独的 WSSSignPart 来指定 SecurityTokenReference 变换算法,该算法以 WSSSignPart.TRANSFORM_STRT10 属性表示。不能直接以数字方式签署 SAML 令牌。该属性使 Web Service 安全运行时环境可以生成 SecurityTokenReference 元素以引用 SAML 令牌以及使用 SecurityTokenReference 变换以数字方式签署 SAMLToken。 以下代码行指定使用 WSSSignPart.TRANSFORM_STRT10 属性:
      WSSSignPart sigPart = factory.newWSSSignPart();
      sigPart.setSignPart(samlToken);
      	  sigPart.addTransform(WSSSignPart.TRANSFORM_STRT10);
    5. 将 WSSGenerationContext 对象附加到 Web service RequestContext 对象。 WSSGenerationContext 对象现在包含格式化请求消息所需的所有安全信息。gencont.process(requestContext) 方法调用将 WSSGenerationContext 对象附加到 web service RequestContext 对象以支持 Web Service 安全运行时环境来格式化所需的 SOAP 安全头;例如:
      // 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. 创建了 WSSVerification 对象且消息主体添加到验证对象,以便 Web service 安全运行时环境验证数字签名。
      以下代码行用于初始化 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 令牌,然后使用 JAX-WS 编程模型和 WSS API 将此令牌随 Web service 请求消息一起发送。

示例

以下代码示例是一个准备好使用的完整 Web service 客户机应用程序,其演示如何创建自签发 SAML sender-vouches 令牌以及在 Web service 请求消息中发送该 SAML 令牌。该样本代码说明先前描述的过程步骤。

/**
 * 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.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 = "9081";
  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("java.security.auth.login.config", "profile_root/properties/wsjaas.conf");

      // Initialize WSSFactory object 
      WSSFactory factory = WSSFactory.getInstance();		
      // Initialize WSSGenerationContext
      WSSGenerationContext gencont = factory.newWSSGenerationContext();
      // Initialize SAML issuer configuration via custom properties
      HashMap<Object, Object> customProps = new HashMap<Object,Object>();

      customProps.put(SamlConstants.ISSUER_URI_PROP, "example.com");
      customProps.put(SamlConstants.TTL_PROP, "3600000");
      customProps.put(SamlConstants.KS_PATH_PROP, "keystores/saml-provider.jceks");
      customProps.put(SamlConstants.KS_TYPE_PROP, "JCEKS");
      customProps.put(SamlConstants.KS_PW_PROP, "{xor}LCswLTovPiws");
      customProps.put(SamlConstants.KEY_ALIAS_PROP, "samlissuer");
      customProps.put(SamlConstants.KEY_NAME_PROP, "CN=SAMLIssuer, O=EXAMPLE");
      customProps.put(SamlConstants.KEY_PW_PROP, "{xor}NDomLz4sLA==");
      customProps.put(SamlConstants.TS_PATH_PROP, "keystores/saml-provider.jceks");
      customProps.put(SamlConstants.TS_TYPE_PROP, "JCEKS");
      customProps.put(SamlConstants.TS_PW_PROP, "{xor}LCswLTovPiws");  
      gencont.add(customProps); //Add custom properties

      // Create SAMLToken 
      HashMap<Object, Object> map = new HashMap<Object, Object>();
      map.put(SamlConstants.CONFIRMATION_METHOD, "sender-vouches");
      map.put(SamlConstants.TOKEN_TYPE, WSSConstants.SAML.SAML20_VALUE_TYPE);
      map.put(SamlConstants.SAML_NAME_IDENTIFIER, "Alice");
      map.put(SamlConstants.SIGNATURE_REQUIRED, "true");
      SAMLGenerateCallbackHandler callbackHandler = new SAMLGenerateCallbackHandler(map);

      SecurityToken samlToken = factory.newSecurityToken(SAMLToken.class, callbackHandler, "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 service 客户机应用程序样本正确运行时,您收到如下的消息:
SAMLToken id = _6CDDF0DBF91C044D211271166233407
Retrieving document at 'file:profile_root/.../wsdl/'.
>> CLIENT: SEI Echo to http://localhost:9080/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_usingwssapi
文件名:twbs_configsamlsendervouches_msglevel_usingwssapi.html