Creación de una señal de poseedor de clave de SAML utilizando la API

La señal de poseedor de clave de SAML amplía la interfaz pública de señal de seguridad en WebSphere Application Server y se puede utilizar como señal de protección. WebSphere Application Server proporciona una API de biblioteca SAML para crear señales de poseedor de clave de SAML.

Acerca de esta tarea

La creación de la señal SAML necesita tres parámetros:
  • com.ibm.wsspi.wssecurity.saml.config.RequesterConfig
  • com.ibm.wsspi.wssecurity.saml.config.ProviderConfig
  • com.ibm.wsspi.wssecurity.saml.config.CredentialConfig
Siga estos pasos para crear una instancia para cada parámetro y luego cree una señal de poseedor de clave de SAML. Como alternativa a CredentialConfig, también puede utilizar javax.security.auth.Subject. Para obtener más información, lea la documentación de la API.

Procedimiento

  1. Cree una instancia com.ibm.websphere.wssecurity.wssapi.token.SAMLTokenFactory utilizando la versión de la señal SAML como parámetro. Las versiones soportadas de SAMLToken son http://docs.oasis-open.org/wss/oasis-wss-saml-token-profile-1.1#SAMLV1.1 y http://docs.oasis-open.org/wss/oasis-wss-saml-token-profile-1.1#SAMLV2.0. La instancia SAMLTokenFactory es un singleton y, por tanto, de hebra protegida. Utilice una de estas líneas de código para crear la instancia, dependiendo de la versión de la señal.
    • Utilice la siguiente línea de código para crear una instancia com.ibm.websphere.wssecurity.wssapi.token.SAMLTokenFactory para una señal SAML de la versión 1.1:
      SAMLTokenFactory samlFactory = SAMLTokenFactory.getInstance(SAMLTokenFactory.WssSamlV11Token11);
    • Utilice la siguiente línea de código para crear una instancia com.ibm.websphere.wssecurity.wssapi.token.SAMLTokenFactory para una señal SAML de la versión 2.0:
      SAMLTokenFactory samlFactory = SAMLTokenFactory.getInstance(SAMLTokenFactory.WssSamlV11Token20);
  2. La instancia SAMLTokenFactory se utiliza para crear una instancia RequesterConfig que determina cómo se genera la señal, en función de los requisitos de autenticación del solicitante. Utilice una de estas líneas de código para crear la instancia RequesterConfig, en función de si desea que la señal utiliza una clave secreta (clave simétrica) o una clave pública:
    • Utilice la línea de código siguiente para crear una instancia RequesterConfig predeterminada para la señal de poseedor de clave de SAML utilizando una clave secreta (clave simétrica), que se incluye en SubjectConfirmation:
      RequesterConfig reqData = samlFactory. newSymmetricHolderOfKeyTokenGenerateConfig ();
      También debe establecer el alias clave para el servicio de destino de forma que el proveedor pueda cifrar la clave secreta para el servicio:
      reqData.setKeyAliasForAppliesTo("SoapRecipient");
    • Utilice la línea de código siguiente para crear una instancia RequesterConfig predeterminada para la señal de poseedor de clave de SAML utilizando una clave pública, que se incluye en SubjectConfirmation:
      RequesterConfig reqData = samlFactory. newAsymmetricHolderOfKeyTokenGenerateConfig ();
      También debe establecer el alias de clave para el solicitante de modo que el proveedor puede extraer la clave pública del solicitante e incluir la clave en la instancia SubjectConfirmation:
      reqData.setKeyAliasForRequester(“Iniciador
      SOAP”);
    La instancia RequestConfig predeterminada es suficiente para generar una señal de poseedor de clave simple, pero se pueden incluir aserciones adicionales en la señal SAML personalizando la instancia RequesterConfig. Por ejemplo, para incluir información de autenticación mediante contraseña en la señal, utilice setAuthenticationMethod:
    reqData.setAuthenticationMethod(“contraseña”);
  3. Utilice SAMLTokenFactory para crear una instancia ProviderConfig, que describe el emisor de la señal. La instancia ProviderConfig especifica el nombre del emisor SAML, así como información sobre el almacén de claves y el almacén de confianza que identifican la clave para el cifrado y firma de SAML. La instancia ProviderConfig se crea utilizando los valores de propiedad a partir de un archivo de propiedades. El archivo de propiedades especifica el valor predeterminado del objeto ProviderConfig. En un entorno de cliente Java™, este archivo de propiedades se define mediante una propiedad del sistema de JVM, com.ibm.webservices.wssecurity.platform.SAMLIssuerConfigDataPath.
    En el entorno de ejecución de WebSphere Application Server, el nombre del archivo de propiedades es SAMLIssuerConfig.properties. El archivo se puede localizar en el directorio de configuración de nivel de servidor o en el directorio de nivel de célula, en ese orden de prioridad. A continuación se proporciona un ejemplo de la vía de acceso a nivel de servidor:
    raíz_servidor_aplicaciones/profiles/$PROFILE/config/cells/$CELLNAME/nodes/$NODENAME/servers/$SERVERNAME/SAMLIssuerConfig.properties
    A continuación se proporciona un ejemplo de la vía de acceso a nivel de célula:
    raíz_servidor_aplicaciones/profiles/$PROFILE/config/cells/$CELLNAME/sts/SAMLIssuerConfig.properties

    La propiedad del sistema de JVM, com.ibm.webservices.wssecurity.platform.SAMLIssuerConfigDataPath, se ignora si la propiedad está definida en el entorno de ejecución del servidor. Para obtener una descripción detallada de todas las propiedades, consulte la información acerca de la configuración de una señal SAML durante la creación de señales.

    Utilice la siguiente línea de código para crear una instancia ProviderConfig predeterminada:

    ProviderConfig samlIssuerCfg = samlFactory.newDefaultProviderConfig(“cualquier nombre de emisor”);
    El nombre del emisor es opcional. Si se especifica el nombre del emisor, éste aparece en la aserción SAML. Si no se especifica el nombre del emisor, se utiliza como nombre de emisor una propiedad de nombre de emisor predeterminado del archivo SAMLIssuerConfig.properties.
  4. Opcional: Al crear una nueva señal SAML, SAMLTokenFactory utiliza un sujeto JAAS o una instancia CredentialConfig para llenar la nueva señal SAML. Para utilizar un sujeto JAAS para llenar la señal, utilice la API com.ibm.websphere.security.auth.WSSubject getCallerSubject() o a la API getRunAsSubject() para obtener un sujeto JAAS que represente al cliente solicitante, o la identidad de la hebra de ejecución.

    Cuando se utiliza el sujeto JAAS para crear una nueva señal SAML, SAMLTokenFactory busca un objeto SAMLToken en la lista PrivateCredentials del sujeto. Si existe un objeto SAMLToken, el valor de NameId o NameIdentifier se copiará en la nueva señal SAML. SAMLTokenFactory también copia los atributos y AuthenticationMethod de SAML de la señal SAML existente en la señal SAML nueva. La nueva señal SAML incluye un nuevo nombre de emisor, un nuevo certificado de firma, un método de confirmación, una nueva KeyInfo para el método de confirmación de holder-of-key y nuevas condiciones NotBefore y NotOnAfter. Estos valores de señal se determinan mediante los parámetros de configuración de los objetos ProviderConfig y RequesterConfig.

    Si no hay ningún objeto SAMLToken en el tema, sólo el nombre del principal de WSPrincipal se copiará del tema a la nueva señal SAML. No se copia ningún otro atributo del tema en la nueva señal SAML. Asimismo, el nombre del emisor, el certificado de firma, el método de confirmación, la información de KeyInfo para la señal Holder-of-key y las condiciones NotBefore y NotOnOrAfter se determinan mediante parámetros de configuración en los objetos ProviderConfig y RequesterConfig.

    Como alternativa, puede utilizar el método RunAsSubject en la hebra de ejecución para crear la señal SAML. Cuando utilice este método, no pase el sujeto JAAS o el objeto CredentialConfig a la SAMLTokenFactory para crear la señal SAML. En su lugar, el contenido de la señal SAML existente se copia en la señal SAML nueva, tal como se ha descrito anteriormente.

    Otro método para crear una señal SAML es utilizar un objeto CredentialConfig para rellenar mediante programación atributos y el valor NameId de SAML. Utilice este método en las circunstancias siguientes:
    • Se deben incluir atributos de SAML personalizados en la nueva señal SAML.
    • La señal SAML se crea manualmente en lugar de utilizar SAMLTokenFactory para llenar la señal SAML a partir de un sujeto JAAS de forma automática.
    • No existe ninguna señal SAML en el sujeto.
    • No hay ningún sujeto JAAS disponible.

    Para crear un objeto CredentialConfig sin utilizar el sujeto JAAS, utilice esta línea de código:

    CredentialConfig cred = samlFactory.newCredentialConfig ();
    No se proporciona ningún valor inicial para este objeto CredentialConfig, por lo que debe utilizar métodos setter para llenar el objeto CredentialConfig.
    Para llenar el NameIdentifier o el NameID de SAML, utilice la línea de código siguiente:
    cred.setRequesterNameID("cualquier nombre");
    El valor de la variable cualquier nombre se utiliza como el nombre principal de la señal SAML. El nombre aparece en la aserción como valor deNameIdentifier en una señal SAML de la versión 1.1, o como valor de NameId en una señal SAML de la versión 2.0. Por ejemplo, si el valor de cualquier nombre es Alice, se generará la aserción siguiente en una señal SAML de la versión 1.1:
    <saml:NameIdentifier>Alice</saml:NameIdentifier>
    La aserción siguiente se genera en una señal SAML de la versión 2.0:
    <saml2:NameID>Alice</saml2:NameID> 

    Para incluir atributos SAML en la parte <AttributeStatement> de una aserción, utilice este código:

    SAMLAttribute samlAttribute = new SAMLAttribute("email" /* Name*/, new String[] {"joe@websphere"} 
    /*Attribute Values*/, null, "IBM WebSphere namespace" /* namespace*/, "email" /* format*/, "joe" /*friendly name */);
    ArrayList<SAMLAttribute> al = new ArrayList<SAMLAttribute>();
    al.add(samlAttribute)
    sattribute = new SAMLAttribute("Membership", new String[] {"Super users", "Gold membership"}, null, null /* format*/, null, null );
    al.add(samlAttribute );
    cred.setSAMLAttributes(al);
    Este código de ejemplo genera las siguientes aserciones <Attribute>:
    <saml:Attribute AttributeName="email" NameFormat="email" AttributeNamespace="IBM WebSphere namespace">
    <saml:AttributeValue>joe@websphere</saml:AttributeValue>
    </saml:Attribute><saml:Attribute AttributeName="Membership">
    <saml:AttributeValue>Super users</saml:AttributeValue><saml:AttributeValue>Gold membership</saml:AttributeValue>
    </saml:Attribute>
  5. Genere una señal de poseedor de clave de SAML utilizando esta línea de código:
    SAMLToken samlToken = samlFactory.newSAMLToken(cred, reqData, samlIssuerCfg);
    Este método requiere el permiso de seguridad Javawssapi.SAMLTokenFactory.newSAMLToken. de seguridad Java Complete los ejemplos de código utilizando líneas de código de los pasos anteriores incluidos en la sección Ejemplo.

Ejemplo

Utilice este código de ejemplo para crear una señal de poseedor de clave de la versión 1.1 de SAML utilizando una clave secreta (clave simétrica) del asunto.
import com.ibm.wsspi.wssecurity.saml.config.RequesterConfig;
import com.ibm.wsspi.wssecurity.saml.config.ProviderConfig;
import com.ibm.wsspi.wssecurity.saml.config.CredentialConfoig ; 
import com.ibm.websphere.wssecurity.wssapi.token.SAMLTokenFactory 

SAMLTokenFactory samlFactory =  SAMLTokenFactory.getInstance(SAMLTokenFactory.WssSamlV11Token11);

RequesterConfig reqData  =  samlFactory.newSymmetricHolderOfKeyTokenGenerateConfig();

//Correlacione "AppliesTo" con el alias clave, de forma que la biblioteca sepa cómo cifrar la clave simétrica
reqData.setKeyAliasForAppliesTo("SOAPRecipient"); 

ProviderConfig samlIssuerCfg = samlFactory.newDefaultProviderConfig(IsserUri);

Subject subject =  com.ibm.websphere.security.auth.WSSubject.getRunAsSubject(); 

SAMLToken samlToken = samlFactory.newSAMLToken(subject, reqData, samlIssuerCfg);
Utilice este código de ejemplo para crear una señal de poseedor de clave de la versión 2.0 de SAML utilizando una clave pública del tema:
//Expresión de usuario sobre cómo se debería crear SAML, tomando como valor predeterminado
RequesterConfig reqData =  samlFactory.newAsymmetricHolderOfKeyTokenGenerateConfig();

//Elija una clave pública que se incluirá en SAML
reqData.setKeyAliasForRequester("SOAPInitiator"); 

//Obtenga el almacén de claves del emisor de forma que pueda firmar o cifrar la aserción, el nombre del emisor
ProviderConfig samlIssuerCfg = samlFactory.newDefaultProviderConfig("cualquier_emisor");

//Obtenga el tema JAAS de forma que la fábrica pueda llenar el valor del principal y los atributos en SAML
Subject subject =  com.ibm.websphere.security.auth.WSSubject.getRunAsSubject(); 

SAMLToken samlToken = samlFactory.newSAMLToken(subject, reqData, samlIssuerCfg);
Utilice este código de ejemplo para crear una señal de poseedor de clave de la versión 2.0 de SAML utilizando una clave secreta (clave simétrica):
SAMLTokenFactory samlFactory =  SAMLTokenFactory.getInstance (SAMLTokenFactory.WssSamlV20Token11);

RequesterConfig reqData = samlFactory. newSymmetricHolderOfKeyTokenGenerateConfig ();
//Correlacione "AppliesTo" con el alias clave, de forma que la biblioteca sepa cómo cifrar la clave simétrica
reqData.setKeyAliasForAppliesTo("SOAPRecipient"); 

ProviderConfig samlIssuerCfg = samlFactory.newDefaultProviderConfig(null);

CredentialConfig cred = samlFactory.newCredentialConfig ();
cred.setRequesterNameID("cualquier_nombre"); 

SAMLToken samlToken = samlFactory.newSAMLToken(subject, reqData, samlIssuerCfg);

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_createholderofkeytoken
File name: twbs_createholderofkeytoken.html