API de Cliente WS-Trust

A interface de programação de aplicativos (API) de cliente WS-Trust inclui a classe WSSTrustClient, a classe WSSTrustClientValidateResult e outras classes do utilitário de configuração. A classe WSSTrustClient fornece funções auxiliares que enviam pedidos SOAP WS-Trust para o Security Token Service (STS) externo especificado para que o STS possa emitir ou validar uma ou mais asserções SAML e outros tipos de tokens de segurança.

Visão geral

O WebSphere Application Server inclui a função do cliente WS-Trust, implementada por meio da classe WSSTrustClient, que envia solicitações SOAP do WS-Trust para um Serviço do Token de Segurança (STS) externo especificado. Usando os pedidos de confiança, o STS pode emitir uma ou mais asserções SAML ou outros tipos de tokens de segurança. A classe WSSTrustClient suporta a especificação OASIS WS-Trust Versão 1.3 e também a especificação WS-Trust Versão 1.2. Além disso, as especificações SOAP Versão 1.1 e SOAP Versão 1.2 são suportadas pela função.

O código de amostra a seguir demonstra como o cliente de serviços da Web usa a API WSSTrustClient para solicitar um token de transmissão SAML. No texto explicativo que precede a amostra de código, o termo token SAML é usado de forma intercambiável com o termo asserção SAML.

A Classe WSSTrustClient

É possível copiar o código de amostra para um aplicativo da ferramenta de montagem, como o Rational Application Developer, e começar a usar o código após a conclusão das etapas de configuração. Use a classe WSSTrustClient juntamente com outras APIs SAML para construir funções SAML úteis. Consulte o Javadoc da API SAML para obter informações adicionais.

A classe WSSTrustClient é uma classe abstrata e possui duas implementações concretas: uma implementação WS-Trust Versão 1.3 e uma implementação WS-Trust v1.2. Na linha 50 da amostra de código, o código do cliente de serviços da Web SAMLWSTrustClientExample chama o método WSSTrustClient.getInstance(ProviderConfig) para recuperar a implementação WS-Trust v1.3. O método getInstance() usa um único objeto ProviderConfig, que especifica dados de configuração que são relevantes para o emissor do token SAML. Um objeto ProviderConfig também é instanciado no código de amostra na linha 32. O código do cliente envia mensagens de pedido WS-Trust Versão 1.3 para um terminal STS de destino. Na amostra, o terminal é https://MyCompany/Trust/13/UsernameMixed. Para usar o código de amostra, substitua este terminal STS de exemplo pelo terminal STS específico que você planeja usar.

Nota: A partir do WebSphere Application Server Release 8 é possível usar a classe com.ibm.websphere.wssecurity.wssapi.token.SAMLToken na interface de programação de aplicativos (API) do Web Services Security (WSS). Quando não houver nenhum problema de confusão, o termo SAMLToken será usado em vez de usar o nome completo do pacote. É possível usar a API do WSS para solicitar o processamento do SAMLToken a partir de um Security Token Service (STS) externo, para propagar SAMLTokens nas mensagens de solicitação SOAP e para usar uma chave simétrica ou assimétrica identificada pelos SAMLTokens para proteger mensagens SOAP.

O suporte do WSS API SAML complementa as interfaces com.ibm.websphere.wssecurity.wssapi.token.SAMLTokenFactory e com.ibm.websphere.wssecurity.wssapi.trust.WSSTrustClient. Os SAMLTokens que são gerados usando o método com.ibm.websphere.wssecurity.wssapi.WSSFactory newSecurityToken() podem ser processados pelas interfaces de programação SAMLTokenFactory e WSSTrustClient. Por outro lado, os SAMLTokens que são gerados pelo SAMLTokenFactory ou retornados pelo WSSTrustClient podem ser usados no WSS API. Decidir qual API será usada no seu aplicativo depende das suas necessidades específicas. O suporte do WSS API SAML é autocontido no sentido em que ele fornece uma funcionalidade equivalente à funcionalidade das interfaces SAMLTokenFactory e WSSTrustClient até o ponto em que os aplicativos clientes de serviços da Web forem interessados. A interface SAMLTokenFactory possui funções adicionais para validar os SAMLTokens e para criar o Assunto JAAS que representa SAMLTokens autenticados. Essa validação é útil para o lado do provedor de serviços da Web. Quando desenvolver seus aplicativos para consumir os SAMLTokens, a interface de programação SAMLTokenFactory será a mais adequada.

Exemplo: Código do cliente de serviços da Web que usa a classe WSSTrustClient

1.  package sample;
2.  
.   import com.ibm.websphere.wssecurity.wssapi.WSSException;
4.   import com.ibm.websphere.wssecurity.wssapi.token.SecurityToken;
5.   import com.ibm.websphere.wssecurity.wssapi.trust.WSSTrustClient;
6.   import com.ibm.websphere.wssecurity.wssapi.token.SAMLToken;
7.   import com.ibm.websphere.wssecurity.wssapi.XMLStructure;
8.  
9.  
10.  import com.ibm.wsspi.wssecurity.core.token.config.RequesterConfiguration;
11.  import com.ibm.wsspi.wssecurity.core.token.config.WSSConstants.Namespace;
12.  import com.ibm.wsspi.wssecurity.core.token.config.WSSConstants.TokenType;
13.  import com.ibm.wsspi.wssecurity.core.token.config.WSSConstants.WST13;
14.  import com.ibm.wsspi.wssecurity.trust.config.ProviderConfig;
15.  import com.ibm.wsspi.wssecurity.trust.config.RequesterConfig;
16.  import com.ibm.wsspi.wssecurity.wssapi.OMStructure;
17.  
18.  import org.apache.axiom.om.OMElement;
19.  import org.apache.axis2.util.XMLPrettyPrinter;
20.  
21.  import java.util.List;
22.  import java.io.ByteArrayOutputStream;
23.  import java.io.InputStream;
24.  import java.io.BufferedReader; 
25.  import java.io.InputStreamReader; 
26.  import java.io.IOException; 
27.  
28.  public class WSSTrustClientExample {
29.  
30.    public static void main(String[] args) {
31.          try {
32.          ProviderConfig providerConfig = WSSTrustClient.newProviderConfig(Namespace.WST13, https://MyCompany.com/Trust/13/UsernameMixed );
33.        
34.          showProviderConfigDefaultValue(providerConfig);
35.        
36.          providerConfig.setPolicySetName("Username WSHTTPS default");
37.          providerConfig.setBindingName("SamlTCSample");
38.          providerConfig.setBindingScope("domain");
39.  
40.  
41.          RequesterConfig requesterConfig = WSSTrustClient.newRequesterConfig(Namespace.WST13);
42.          
43.          showRequestConfigDefaultValue(requesterConfig);
44.          
45.          requesterConfig.put(RequesterConfiguration.RSTT.APPLIESTO_ADDRESS, "https://user.MyCompany:9443/WSSampleSei/EchoService12");
46.          requesterConfig.put(RequesterConfiguration.RSTT.TOKENTYPE, TokenType.SAML11);
47.          requesterConfig.put(RequesterConfiguration.RSTT.KEYTYPE, WST13.KEYTYPE_BEARER);
48.          requesterConfig.setSOAPNamespace(Namespace.SOAP12);
49.          
50.          WSSTrustClient client = WSSTrustClient.getInstance(providerConfig);
51.          List<SecurityToken> securityTokens = client.issue(providerConfig, requesterConfig);
52.          
53.          // Processar token SAML
54.          if (securityTokens != null && !securityTokens.isEmpty()) {
55.            System.out.println("Number of tokens returned = " + securityTokens.size());
56.            SecurityToken token = securityTokens.get(0);
57.            if (token instanceof SAMLToken) {            
58.              showSAMLToken((SAMLToken)token);
59.            } else {
60.              System.out.println("Returned token is not an SAMLToken");
61.            }
62.          } else {
63.            System.out.println("No securityToken obtained.");
64.          }
65.          
66.      } catch (SoapSecurityException ex) {
67.        System.out.println("Caught exception: " + ex.getMessage());
68.        ex.printStackTrace();
69.      }
70.    }
71.  
72.    private static void showProviderConfigDefaultValue(ProviderConfig providerConfig) {
73.      System.out.println("providerConfig.getApplicationName() = " + providerConfig.getApplicationName());
74.      System.out.println("providerConfig.getBindingName() = " + providerConfig.getBindingName());
75.      System.out.println("ProviderConfig.getBindingScope() = " + providerConfig.getBindingScope());
76.      System.out.println("providerConfig.getIssuerURI() = " + providerConfig.getIssuerURI());
77.  
78.      System.out.println("providerConfig.getPolicySetName() = " + providerConfig.getPolicySetName());
79.      System.out.println("ProviderConfig.getPortName() = " + providerConfig.getPortName());
80.      System.out.println("providerConfig.getProvider() = " + providerConfig.getProvider());
81.      System.out.println("ProviderConfig.getServiceName() = " + providerConfig.getServiceName());
82.      System.out.println("providerConfig.getWSTrustNamespace() = " + providerConfig.getWSTrustNamespace());
83.      System.out.println("ProviderConfig.toString() = " + providerConfig.toString());
84.    }
85.    
86.    private static void showRequestConfigDefaultValue(RequesterConfig requesterConfig) {
87.      System.out.println("requesterConfig.getRSTTProperties() = " + requesterConfig.getRSTTProperties());
88.      System.out.println("requesterConfig.getSecondaryParameters() = " + requesterConfig.getSecondaryParameters());
89.      System.out.println("requesterConfig.getSOAPNamespace() = " + requesterConfig.getSOAPNamespace());
90.      System.out.println("requesterConfig.getWSAddressingNamespace() = " + requesterConfig.getWSAddressingNamespace());
91.     
92.      System.out.println("requesterConfig.getMessageID() = " + requesterConfig.getMessageID());
93.      System.out.println("requesterConfig.toString() = " + requesterConfig.toString());
94.    }
95.    
96.    private static void showSAMLToken(SAMLToken samlToken){
97.      System.out.println("samlToken.getAssertionQName() = " + samlToken.getAssertionQName());
98.      System.out.println("samlToken.getAudienceRestriction() = " + samlToken.getAudienceRestriction());
99.      System.out.println("samlToken.getAuthenticationMethod() = " + samlToken.getAuthenticationMethod());
100.     System.out.println("samlToken.getConfirmationMethod() = " + samlToken.getConfirmationMethod());
101.     System.out.println("samlToken.getId() = " + samlToken.getId());
102.     System.out.println("samlToken.getKeyIdentifier() = " + samlToken.getKeyIdentifier());
103.     System.out.println("samlToken.getKeyIdentifierEncodingType() = " + samlToken.getKeyIdentifierEncodingType());
104.     System.out.println("samlToken.getKeyIdentifierValueType() = " + samlToken.getKeyIdentifierValueType());
105.     System.out.println("samlToken.getKeyName() = " + samlToken.getKeyName());
106.     System.out.println("samlToken.getPrincipal() = " + samlToken.getPrincipal());
107.     System.out.println("samlToken.getProperties() = " + samlToken.getProperties());
108.     System.out.println("samlToken.getReferenceURI() = " + samlToken.getReferenceURI());
109.     System.out.println("samlToken.getSAMLAttributes() = " + samlToken.getSAMLAttributes());
110.     System.out.println("samlToken.getSamlCreated() = " + samlToken.getSamlCreated());
111.     System.out.println("samlToken.getSamlExpires() = " + samlToken.getSamlExpires());
112.     System.out.println("samlToken.getSamlID() = " + samlToken.getSamlID());
113.     System.out.println("samlToken.getSAMLIssuerName() = " + samlToken.getSAMLIssuerName());
114.     System.out.println("samlToken.getSAMLNameID() = " + samlToken.getSAMLNameID());
115.     System.out.println("samlToken.getStringAttributes() = " + samlToken.getStringAttributes());
116.     System.out.println("samlToken.getSubjectDNS() = " + samlToken.getSubjectDNS());
117.     System.out.println("samlToken.getSubjectIPAddress() = " + samlToken.getSubjectIPAddress());
118.     System.out.println("samlToken.getThumbprint() = " + samlToken.getThumbprint());
119.     System.out.println("samlToken.getThumbprintEncodingType() = " + samlToken.getThumbprintEncodingType());
120.     System.out.println("samlToken.getThumbprintValueType() = " + samlToken.getThumbprintValueType());
121.     System.out.println("samlToken.getTokenQname() = " + samlToken.getTokenQname());
122.     System.out.println("samlToken.getValueType() = " + samlToken.getValueType());    
123.          
124.    XMLStructure samlXmlStructure = samlToken.getXML();
125.     if (samlXmlStructure != null && samlXmlStructure instanceof OMStructure) {
126.     OMStructure samlOMStructure = (OMStructure) samlXmlStructure;
127.     System.out.println("((OMStructure)samlToken.getXML()).getNode()formatted = " + formatXML(samlOMStructure.getNode()));
128.    }
129.      
130.    try {
131.      InputStream is = samlToken.getXMLInputStream();
132.      if (is != null) {
133.        try {
134.          BufferedReader reader = new BufferedReader(new InputStreamReader(is)); 
135.          StringBuilder sb = new StringBuilder();        
136.          String line = null;           
137.          while ((line = reader.readLine()) != null) {               
138.            sb.append(line + "\n");            
139.          } 
140.          System.out.println(sb.toString()); 
141.        } catch (Exception ex) {
142.          System.out.println("Caught exception reading from InputStream: " + ex.getMessage());
143.          ex.printStackTrace();
144.        } finally {        
145.          try {              
146.            is.close();            
147.          } catch (IOException e) {                
148.            e.printStackTrace(); 
149.          }  
150.        } 
151.      }
152.    } catch (WSSException wex) {
153.      System.out.println("Caught exception getXMLInputStream(): " + wex.getMessage());
154.      wex.printStackTrace();
155.    }
156.  }  
157.    
158.  private static String formatXML(OMElement omInput) {
159.    ByteArrayOutputStream out = new ByteArrayOutputStream();
160.    String output = "";
161.  
162.    try {
163.          XMLPrettyPrinter.prettify(omInput, out);
164.          output = out.toString();
165.    } catch (Throwable e) {
166.        try {
167.            output = omInput.toString();
168.        } catch (Throwable e2) {
169.                System.out.println("Caught exception: " + e2.getMessage());
170.        e2.printStackTrace();
171.        }
172.        }
173.    return output;
174.  }
175.  
176.  }

Suporte à Classe WSSTrustClient para Conjuntos de Políticas e Ligações

A função de cliente WS-Trust suporta ligações específicas do aplicativo e ligações gerais para uso com documentos do conjunto de políticas e ligação do cliente de confiança. Além disso, as ligações gerais e ligações padrão serão suportadas se o aplicativo estiver em execução no ambiente do servidor de aplicativos. As ligações gerais são suportadas no ambiente do thin client, mas as ligações padrão não são.

Gerenciar o conjunto de política e as ligações para a API de cliente WS-Trust é semelhante ao gerenciamento de um conjunto de política e das ligações para um cliente de serviços da Web. No entanto, existem diferenças que são exclusivas do cliente WS-Trust. Uma diferença é que o cliente WS-Trust não usa conexões do conjunto de políticas. Em vez disso, o nome do conjunto de políticas e o nome da ligação são especificados em um objeto ProviderConfig, conforme mostrado na linha 36 e na linha 37 do código de amostra.

Quando o cliente WS-Trust procura pela ligações, a maneira pela qual o cliente gerencia o escopo da procura difere do cliente de serviços da Web. Se você não especificar a propriedade wstrustClientBindingScope para a ligação de cliente de confiança, o sistema primeiro procurará no aplicativo uma ligação específica do aplicativo com o nome da ligação especificado. Se for localizada uma ligação, ela será usada para o pedido do cliente de confiança. Se não for localizada nenhuma ligação específica do aplicativo, o sistema procurará nas ligações gerais disponíveis uma ligação com o nome especificado. Se for localizada uma ligação geral, ela será usada para o pedido do cliente de confiança. Se não for localizada nenhuma ligação com o nome específico, as ligações padrão serão usadas em um ambiente do servidor. As ligações padrão são usadas apenas em um ambiente do servidor. Se o escopo da ligação for especificado, apenas esse escopo será usado para a procura da ligação.

A linha 38 do código de amostra, providerConfig.setBindingScope("domain"), indica que o exemplo usa ligações gerais. Também é possível configurar o escopo da ligação como aplicativo para indicar que o código de amostra usa ligações específicas do aplicativo. O exemplo usa a ligação geral chamada SamlTCSample. As ligações específicas do aplicativo e gerais são suportadas no servidor de aplicativos e no ambiente do thin client. Para obter informações adicionais sobre como configurar as ligações SamlTCSample quando o aplicativo for instalado no servidor de aplicativos, leia sobre como configurar conjuntos de política e ligações para comunicação com o STS.

A código showProviderConfigDefaultValue(providerConfig) na linha 34 do código de amostra mostra as configurações padrão. O código de amostra inclui um método de utilitário que imprime o conteúdo de providerConfig.

A linha 51 do código de amostra, List<SecurityToken> securityTokens = client.issue(providerConfig, requesterConfig), envia uma solicitação de emissão do WS-Trust. O segundo parâmetro nesta linha especifica o objeto RequesterConfig, e este parâmetro determina o conteúdo do pedido de emissão. O código na linha 41, RequesterConfig requesterConfig = WSSTrustClient.newRequesterConfig(Namespace.WST13), instancia um objeto RequesterConfig que é usado para construir o pedido de confiança usando o espaço de nomes WS-Trust Versão 1.3. Uma função de utilitário é mostrada na linha 43: showRequestConfigDefaultValue(requesterConfig). Esta função exibe as configurações padrão para o objeto RequesterConfig. O código entre as linhas 45 e 48 inicializa RequesterConfig para solicitar um token de transmissão SAML Versão 1.1. Este token é usado para acessar o terminal em serviço usando o espaço de nomes SOAP 1.2. No exemplo, o terminal de serviço é https://user.MyCompany.com:9443/WSSampleSei/EchoService12.

Suporte a Argumentos da JVM

Antes de executar o código de amostra, você deve configurar vários argumentos da Java™ Virtual Machine (JVM). O código de amostra implementa o conjunto de políticas padrão Username WSHTTPS, que possui dois requisitos: 1) um token Username é enviado para o STS; e 2) as mensagens são protegidas usando Secure Sockets Layer (SSL). Para configurar o ambiente para atender a estes requisitos, primeiro configure o arquivo ssl.client.props para definir um truststore. Para obter instruções passo a passo, leia sobre a execução de um cliente JAX-WS de serviços da Web não gerenciado.

Para atender ao segundo requisito referente à proteção de mensagens SSL, obtenha uma cópia do certificado X.509 SSL do STS e insira-a no truststore. Para isso, siga as etapas no tópico Usando o Comando retrieveSigners em SSL para ativar a confiança de servidor para servidor. Como alternativa, você pode aceitar o certificado STS quando enviar o primeiro pedido de confiança para o STS, se a propriedade com.ibm.ssl.enableSignerExchangePrompt no arquivo profile_home/properties/ssl.client.props for configurada como true. Para obter informações adicionais sobre esta opção, leia sobre como alterar o prompt de troca automática de assinante no cliente.

Além disso, você deve especificar o arquivo de configuração JAAS do cliente para que o ambiente de tempo de execução do cliente possa localizar a configuração de login do JAAS LoginModule do token Username. Especifique o parâmetro usando este código: -Djava.security.auth.login.config="%WAS_HOME%\properties\wsjaas_client.conf. Você também deve incluir o JAR do thin client, por exemplo, com.ibm.jaxws.thinclient_9.0.jar, no caminho de classe. Para obter informações adicionais, leia sobre a execução de um aplicativo cliente JAX-WS de serviços da Web não gerenciado.

Execução do Código de Amostra

Um pré-requisito para executar o código de amostra é configurar um terminal STS externo para emitir um token de transmissão SAML 1.1 para os serviços da Web especificados conforme definido pela propriedade RequesterConfiguration.RSTT.APPLIESTO_ADDRESS.

A execução do código de amostra gera uma mensagem de pedido de emissão de WS-Trust, conforme mostrado no exemplo:
177.  <?xml version="1.0" encoding="UTF-8"?><soapenv:Envelope xmlns:soapenv="http://www.w3.org/2003/05/soap-envelope">
178.      <soapenv:Header>
179.          <wsa:To xmlns:wsa="http://www.w3.org/2005/08/addressing">https://user.MyCompany.com/Trust/13/UsernameMixed</wsa:To>
180.          <wsa:MessageID xmlns:wsa="http://www.w3.org/2005/08/addressing">urn:uuid:4951B6775950CAC92A1252458259166</wsa:MessageID>
181.          <wsa:Action xmlns:wsa="http://www.w3.org/2005/08/addressing">http://docs.oasis-open.org/ws-sx/ws-trust/200512/RST/Issue</wsa:Action>
182.      </soapenv:Header>
183.      <soapenv:Body>
184.          <wst:RequestSecurityToken xmlns:wst="http://docs.oasis-open.org/ws-sx/ws-trust/200512">
185.              <wst:TokenType>http://docs.oasis-open.org/wss/oasis-wss-saml-token-profile-1.1#SAMLV1.1</wst:TokenType>
186.              <wst:RequestType>http://docs.oasis-open.org/ws-sx/ws-trust/200512/Issue</wst:RequestType>
187.              <wst:KeyType>http://docs.oasis-open.org/ws-sx/ws-trust/200512/Bearer</wst:KeyType>
188.              <wsp:AppliesTo xmlns:wsp="http://schemas.xmlsoap.org/ws/2004/09/policy">
189.                  <wsa:EndpointReference xmlns:wsa="http://www.w3.org/2005/08/addressing">
190.                      <wsa:Address>https://user.MyCompany.com:9443/WSSampleSei/EchoService12</wsa:Address>
191.                  </wsa:EndpointReference>
192.              </wsp:AppliesTo>
193.          </wst:RequestSecurityToken>
194.      </soapenv:Body>
195.  </soapenv:Envelope>
Para visualizar a mensagem de pedido WS-Trust, você deve ativar um rastreio do lado do cliente. Configure as seguintes propriedades JVM:
  • -DtraceSettingsFile=MyTraceSettings.properties
  • -Djava.util.logging.manager=com.ibm.ws.bootstrap.WsLogManager
  • -Djava.util.logging.configureByServer=true
Para obter informações adicionais sobre estas propriedades, leia sobre como ativar o rastreio em aplicativos clientes e independentes. Além de configurar as propriedades JVM, você também deve especificar a configuração de rastreio, com.ibm.ws.wssecurity.*=all=enabled, no arquivo MyTraceSettings.properties. Procure Trust Client outgoing request: no arquivo de log de rastreio.

Retorno do Token SAML

O código na linha 51 do código de amostra, List<SecurityToken> securityTokens = client.issue(providerConfig, requesterConfig), retornará um token SAML se a solicitação de emissão do WS-Trust for processada com êxito. O código entre as linhas 54 e 64 processa o token SAML retornado. A função de utilitário mostrada na linha 58, showSAMLToken((SAMLToken)token), exibe o conteúdo do token SAML recebido. A rotina showSAMLToken() mostra o token SAML como um documento XML. Um exemplo deste documento XML é fornecido na linha 196 até a linha 233 do código de amostra.
196.  <?xml version="1.0" encoding="UTF-8"?>
197.  <saml:Assertion xmlns:saml="urn:oasis:names:tc:SAML:1.0:assertion" MajorVersion="1" MinorVersion="1" 
198.   AssertionID="_f7f65d28-fbb1-4e10-8ddf-f4b6ed0c8277" Issuer="http://MyCompany.com/Trust" 
199.   IssueInstant="2009-09-09T01:04:41.144Z">
200.      <saml:Conditions NotBefore="2009-09-09T01:04:41.141Z" NotOnOrAfter="2009-09-09T11:04:41.141Z">
201.          <saml:AudienceRestrictionCondition>
202.              <saml:Audience>https://user.MyCompany.com:9443/WSSampleSei/EchoService12</saml:Audience>
203.          </saml:AudienceRestrictionCondition>
204.      </saml:Conditions>
205.      <saml:AuthenticationStatement AuthenticationMethod="urn:oasis:names:tc:SAML:1.0:am:password" 
206.       AuthenticationInstant="2009-09-09T01:04:41.131Z">
207.          <saml:Subject>
208.              <saml:SubjectConfirmation>
209.                  <saml:ConfirmationMethod>urn:oasis:names:tc:SAML:1.0:cm:bearer</saml:ConfirmationMethod>
210.              </saml:SubjectConfirmation>
211.          </saml:Subject>
212.      </saml:AuthenticationStatement>
213.      <ds:Signature xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
214.          <ds:SignedInfo>
215.              <ds:CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/>
216.              <ds:SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1"/>
217.              <ds:Reference URI="#_f7f65d28-fbb1-4e10-8ddf-f4b6ed0c8277">
218.                  <ds:Transforms>
219.                      <ds:Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature"/>
220.                      <ds:Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/>
221.                  </ds:Transforms>
222.                  <ds:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/>
223.                  <ds:DigestValue>AQ6e7YQqKgcg/B/ebBj8/DF+uWg=</ds:DigestValue>
224.              </ds:Reference>
225.          </ds:SignedInfo>
226.          <ds:SignatureValue>SuccIOniR . . . . yjTh9iQs=</ds:SignatureValue>
227.          <KeyInfo xmlns="http://www.w3.org/2000/09/xmldsig#">
228.              <X509Data>
229.                  <X509Certificate>MIIB3zCCAUi . . . . itzymqg3</X509Certificate>
230.              </X509Data>
231.          </KeyInfo>
232.      </ds:Signature>
233.  </saml:Assertion>

Ícone que indica o tipo de tópico Tópico de Referência



Ícone de registro de data e hora Última atualização: last_date
http://www14.software.ibm.com/webapp/wsbroker/redirect?version=cord&product=was-nd-mp&topic=rwbs_samltrustclientapi
Nome do arquivo: rwbs_samltrustclientapi.html