Enviando Tokens holder-of-key SAML Autoemitidos com Chave Simétrica Usando APIs do WSS

É possível criar tokens SAML autoemitidos com o método de confirmação de assunto holder-of-key e, em seguida, usar o modelo de programação Java™ API for XML-Based Web Services (JAX-WS) e Web Services Security APIs (WSS APIs) para enviar estes tokens com mensagens de solicitação de serviços da web.

Antes de Iniciar

Essa tarefa assume que você é familiarizado com o modelo de programação JAX-WS, as interfaces API WSS, os conceitos de SAML, e o uso dos conjuntos de política para configurar e administrar as configurações dos serviços da Web. Conclua as ações a seguir antes de iniciar essa tarefa:
  • Leia sobre como enviar tokens de acesso de SAML autoemitidos usando WSS APIs.
  • Leia sobre como enviar tokens sender-vouches SAML autoemitidos usando WSS APIs com proteção no nível da mensagem.

Sobre Esta Tarefa

Essa tarefa é focada no uso da chave simétrica, que é integrada nos tokens de segurança SAML, para gerar uma assinatura digital de elementos de mensagem SOAP selecionados a fim de atender aos requisitos de segurança do método de confirmação de assunto holder-of-key. A política do Web Services Security anexada ao provedor de serviços da Web é a política do conjunto de políticas SAML20 HoK Symmetric WSSecurity padrão que é fornecido no WebSphere Application Server 7.0.0.7 e em liberações posteriores.

Procedimento

  1. Crie um token de segurança SAML que contém um método de confirmação de assunto holder-of-key, por exemplo:
    WSSFactory factory = WSSFactory.getInstance();
    // Inicializar WSSGenerationContext
    com.ibm.websphere.wssecurity.wssapi.WSSGenerationContext gencont = factory.newWSSGenerationContext();
    // Inicializar a configuração do emissor SAML por meio das propriedades customizadas
    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
    HashMap<Object, Object> map = new HashMap<Object, Object>();
    map.put(SamlConstants.CONFIRMATION_METHOD, "holder-of-key");
    map.put(SamlConstants.Token_REQUEST, "issue");
    map.put(SamlConstants.TOKEN_TYPE, WSSConstants.SAML.SAML20_VALUE_TYPE);
    map.put(SamlConstants.SAML_NAME_IDENTIFIER, "Alice");
    map.put(SamlConstants.SIGNATURE_REQUIRED, "true");
    map.put(SamlConstants.SERVICE_ALIAS, "soaprecipient");
    map.put(SamlConstants.KEY_TYPE, 
            "http://docs.oasis-open.org/ws-sx/ws-trust/200512/SymmetricKey");
    map.put(SamlConstants.SAML_APPLIES_TO, "http://localhost:9080/your_Web_service");
    map.put(RequesterConfiguration.RSTT.ENCRYPTIONALGORITHM,
            "http://www.w3.org/2001/04/xmlenc#aes256-cbc");
    map.put(SamlConstants.KEY_SIZE, "256");
    SAMLGenerateCallbackHandler callbackHandler = new
            SAMLGenerateCallbackHandler(map); 
    SAMLToken samlToken = (SAMLToken) factory.newSecurityToken(SAMLToken.class,
            callbackHandler, "system.wss.generate.saml");

    A chave de prova integrada no token de segurança SAML é criptografada para o serviço da Web de destino. A chave pública do serviço de destino que criptografa a chave de prova é especificada pela propriedade SamlConstants.SERVICE_ALIAS, que especifica um certificado público no arquivo de confiança. O local do arquivo de confiança é especificado por uma propriedade customizada com.ibm.websphere.wssecurity.wssapi.WSSGenerationContext. Nesse exemplo, você deve importar o arquivo de políticas Java Cryptography Extension (JCE) porque a criptografia usa um tamanho de chave de 256 bits. Para obter informações adicionais, leia sobre como usar os arquivos de políticas JCE irrestritas no tópico "Ajustando Aplicativos de Segurança de Serviços da Web".

    Se preferir usar chaves derivadas para assinatura digital e para criptografia em vez de usar a chave simétrica diretamente, inclua o seguinte par nome-valor:

    map.put(SamlConstants.REQUIRE_DKT, "true");
  2. Use o objeto WSSGenerationContext para preparar para o processamento do cabeçalho de segurança da mensagem de solicitação, por exemplo:
    gencon.add(samlToken); //this line of code can be omitted
    
    WSSTimestamp timestamp = factory.newWSSTimestamp();
    gencon.add(timestamp);
    
    WSSSignature sig = factory.newWSSSignature(samlToken);
    
    sig.setSignatureMethod(WSSSignature.HMAC_SHA1);
    sig.setCanonicalizationMethod(WSSSignature.EXC_C14N);
    sig.addSignPart(WSSSignature.BODY);
    sig.addSignPart(WSSSignature.TIMESTAMP);
    sig.addSignPart(WSSSignature.ADDRESSING_HEADERS);
    sig.setTokenReference(SecurityToken.REF_KEYID);
    //If the gencon.add(samlToken); line of code is omitted, or DerivedKey is used
    //the above line of code must be replaced with
    //sig.setTokenReference(SecurityToken.REF_STR);
    
    gencon.add(sig);
    
    WSSEncryption enc = factory.newWSSEncryption(samlToken); 
    
    enc.setEncryptionMethod(WSSEncryption.AES256);
    enc.setTokenReference(SecurityToken.REF_KEYID);
    //If the gencon.add(samlToken); line of code is omitted, or DerivedKey is used
    //the above line of code must be replaced with
    //enc.setTokenReference(SecurityToken.REF_STR);
    enc.encryptKey(false);
    enc.addEncryptPart(WSSEncryption.BODY_CONTENT);
    enc.addEncryptPart(WSSEncryption.SIGNATURE);
    gencon.add(enc);
  3. Crie o objeto WSSConsumingContext para preparar para o processamento do cabeçalho de segurança e de mensagem de resposta, por exemplo:
    WSSConsumingContext concont = factory.newWSSConsumingContext();
    
    HashMap<Object, Object> map = new HashMap<Object, Object>();
    
    SAMLConsumerCallbackHandler callbackHandler = new
            SAMLConsumerCallbackHandler(map); 
    
    WSSDecryption dec = factory.newWSSDecryption(SAMLToken.class, callbackHandler,
            "system.wss.consume.saml");
    dec.addAllowedEncryptionMethod(WSSDecryption.AES256);
    dec.encryptKey(false);
    dec.addRequiredDecryptPart(WSSDecryption.BODY_CONTENT); 
    
    concont.add(dec);
    
    callbackHandler = new SAMLConsumerCallbackHandler(map);
    WSSVerification ver = factory.newWSSVerification(SAMLToken.class, callbackHandler,
            "system.wss.consume.saml");
    ver.addAllowedSignatureMethod(WSSVerification.HMAC_SHA1);
    ver.addRequiredVerifyPart(WSSVerification.BODY);
    ver.addRequiredVerifyPart(WSSVerification.TIMESTAMP);
    
    concont.add(ver);
  4. Use o utilitário JDK keytool para gerar os arquivos saml-provider.jceks e recipient.jceks que são usados para testar o código de exemplo, por exemplo:
    keytool -genkey -alias samlissuer -keystore saml-provider.jceks -dname "CN=SAMLIssuer, O=ACME" -storepass issuerstorepass
     -keypass issuerkeypass -storetype jceks -validity 5000 -keyalg RSA -keysize 2048
    
    keytool -genkey -alias soaprecipient -keystore recipient.jceks -dname "CN=SOAPRecipient, O=ACME" -storepass reciptstorepass
     -keypass reciptkeypass -storetype jceks -validity 5000 -keyalg RSA -keysize 2048
    
    keytool -export -alias soaprecipient -file reciptpub.cer -keystore recipient.jceks -storepass reciptstorepass -storetype jceks
    
    keytool -import -alias soaprecipient -file reciptpub.cer -keystore saml-provider.jceks -storepass issuerstorepass -storetype jceks
     -keypass issuerkeypass -noprompt

Resultados

Você conheceu blocos de construção principais para criar um aplicativo cliente de serviços da web para enviar um token de segurança SAML em uma mensagem SOAP e para usar a chave simétrica que é integrada na segurança do SAML na proteção no nível da mensagem.


Ícone que indica o tipo de tópico Tópico de Tarefa



Í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=twbs_configsamlhok_symmetric_usingwssapi
Nome do arquivo: twbs_configsamlhok_symmetric_usingwssapi.html