Envío de señales de poseedor de clave de SAML autoemitidas con clave simétrica utilizando las API WSS

Puede crear señales SAML autoemitidas con el método de confirmación de sujetos holder-of-key y, a continuación, utilizar la API de Java™ para servicios web XML (JAX-WS) y las API de seguridad de servicios web (WSS) para enviar esas señales con mensajes de solicitud de servicios web.

Antes de empezar

En esta tarea se presupone que está familiarizado con el modelo de programación JAX-WS, las interfaces de las API de WSS, los conceptos de SAML y el uso de conjuntos de políticas para configurar y administrar los valores de servicios web. Complete las acciones siguientes antes de iniciar esta tarea:
  • Consulte información sobre el envío de señales bearer SAML autoemitidas mediante las API de WSS.
  • Consulte información sobre el envío de señales sender-vouches SAML autoemitidas mediante las API de WSS con protección a nivel de mensaje.

Acerca de esta tarea

Esta tarea se centra en el uso de la clave simétrica que está incluida en las señales de seguridad SAML para generar una firma digital de elementos message SOAP seleccionados para satisfacer los requisitos de seguridad del método de confirmación de sujetos holder-of-key. La política de seguridad de servicios web conectada al proveedor de servicios web es la del conjunto de políticas predeterminadas de clave simétrica HoK SAML20 que se entrega en WebSphere Application Server 7.0.0.7 y releases posteriores.

Procedimiento

  1. Cree una señal de seguridad SAML que contiene el método de confirmación de sujetos holder-of-key; por ejemplo:
    WSSFactory factory = WSSFactory.getInstance();
    // Inicializar WSSGenerationContext
    com.ibm.websphere.wssecurity.wssapi.WSSGenerationContext gencont = factory.newWSSGenerationContext();
    // Inicializar la configuración del emisor de SAML mediante propiedades personalizadas
    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); //Añadir propiedades personalizadas
    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");

    La clave de prueba incluida en el símbolo de seguridad SAML está cifrada para el servicio web de destino. La clave pública del servicio de destino que cifra la clave de prueba se indica mediante la propiedad SamlConstants.SERVICE_ALIAS que especifica un certificado público en el archivo de confianza. La ubicación del archivo de confianza se especifica mediante una propiedad personalizada com.ibm.websphere.wssecurity.wssapi.WSSGenerationContext. En este ejemplo, debe importar el archivo de políticas JCE (Java Cryptography Extension) porque el cifrado utiliza el tamaño de clave de 256 bits. Para obtener más información, consulte al apartado sobre utilización de archivos de políticas JCE sin restricciones del tema "Ajuste de aplicaciones de seguridad de servicios web".

    Si prefiere utilizar claves derivadas para la firma digital y el cifrado en lugar de utilizar la clave simétrica directamente, añada el siguiente par de nombre y valor:

    map.put(SamlConstants.REQUIRE_DKT, "true");
  2. Utilice el objeto WSSGenerationContext para prepararse para el proceso de cabeceras de seguridad de mensajes de solicitud; por ejemplo:
    gencon.add(samlToken); //esta línea de código se puede omitir 
    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);
    //Si se omite la línea de código gencon.add(samlToken); o se utiliza DerivedKey
    //la línea anterior de código se debe sustituir por
    //sig.setTokenReference(SecurityToken.REF_STR);
    
    gencon.add(sig);
    
    WSSEncryption enc = factory.newWSSEncryption(samlToken); 
    
    enc.setEncryptionMethod(WSSEncryption.AES256);
    enc.setTokenReference(SecurityToken.REF_KEYID);
    //Si se omite la línea de código gencon.add(samlToken); o se utiliza DerivedKey
    //la línea anterior de código se debe sustituir por
    //enc.setTokenReference(SecurityToken.REF_STR);
    enc.encryptKey(false);
    enc.addEncryptPart(WSSEncryption.BODY_CONTENT);
    enc.addEncryptPart(WSSEncryption.SIGNATURE);
    gencon.add(enc);
  3. Cree el objeto WSSConsumingContext para prepararse para el proceso de cabeceras de seguridad del mensaje de respuesta; por ejemplo:
    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. Utilice el programa de utilidad keytool JDK para generar los archivos saml-provider.jceks y recipient.jceks que se utilizan para probar el código de ejemplo; por ejemplo:
    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

Ha obtenido información sobre bloques de creación clave para crear una aplicación cliente de servicios web con el fin de enviar una señal de seguridad SAML en un mensaje SOAP y para utilizar la clave simétrica que está incluida en la seguridad SAML de protección a nivel de mensaje.


Icon that indicates the type of topic Task topic



Timestamp icon Last updated: last_date
http://www14.software.ibm.com/webapp/wsbroker/redirect?version=cord&product=was-nd-mp&topic=twbs_configsamlhok_symmetric_usingwssapi
File name: twbs_configsamlhok_symmetric_usingwssapi.html