Creación de un gestor de claves personalizado para SSL

Puede crear una configuración de gestor de claves personalizado en cualquier ámbito de gestión y asociar el nuevo gestor de claves a una configuración SSL (Secure Sockets Layer).

Antes de empezar

Debe desarrollar, empaquetar y localizar un archivo .JAR (Java™ Archive) para un gestor de claves personalizado en el directorio was.install.root/lib/ext de WebSphere Application Server.

Acerca de esta tarea

Complete los pasos siguientes en la consola administrativa:

Procedimiento

  1. Decida si desea crear el gestor de claves personalizado en el ámbito de la célula o debajo del ámbito de la célula en el nodo, servidor o clúster, por ejemplo.
    Importante: Cuando cree un gestor de claves personalizado en un nivel inferior al ámbito de la célula, puede asociarlo sólo a una configuración SSL (Secure Sockets Layer) del mismo ámbito o de un ámbito superior. Una configuración SSL en un ámbito inferior al del gestor de claves no ve la configuración del gestor de claves.
    • Para crear un gestor de claves personalizado en un ámbito de célula, pulse Seguridad > Gestión de claves y certificados SSL > Gestores de claves. Todas las configuraciones SSL de la célula pueden seleccionar el gestor de claves en el ámbito de la célula.
    • Para crear un gestor de claves personalizado en un ámbito inferior al nivel de célula, pulse Seguridad > Gestión de claves y certificados SSL > Gestionar configuraciones de seguridad de punto final > {Entrada | Salida} > configuración_SSL > Gestores de claves.
  2. Pulse Nuevo para crear un nuevo gestor de claves.
  3. Escriba un nombre de gestor de claves único.
  4. Seleccione el valor de implementación Personalizado. Con el valor personalizado puede definir una clase Java que tenga una implementación en la interfaz Java javax.net.ssl.X509KeyManager y, opcionalmente, en la interfaz WebSphere Application Server com.ibm.wsspi.ssl.KeyManagerExtendedInfo. El valor de implementación estándar sólo se aplica si el gestor de claves ya está definido en la lista de proveedores de seguridad de Java como proveedor y algoritmo, que no es el caso de un gestor de claves personalizado. El gestor de claves estándar típico es algorithm = IbmX509, provider = IBMJSSE2.
  5. Escriba un nombre de clase. Por ejemplo, com.ibm.test.CustomKeyManager.
  6. Seleccione una de las acciones siguientes:
    • Pulse Aplicar y, a continuación, pulse Propiedades personalizadas en Propiedades adicionales para añadir propiedades personalizadas al nuevo gestor de claves personalizado. Cuando haya acabado de añadir propiedades personalizadas, pulse Aceptar y Guardar y, a continuación, vaya al paso siguiente.
    • Pulse Aceptar y Guardar y, a continuación, vaya al paso siguiente.
  7. Pulse Certificado SSL y gestión de claves en la navegación de la página.
  8. Seleccione una de las acciones siguientes:
    • Pulse Configuraciones SSL en Elementos relacionados para una configuración SSL con un ámbito de célula.
    • Pulse Gestionar configuraciones de seguridad de punto final para seleccionar una configuración SSL en un ámbito inferior.
  9. Pulse el enlace de la configuración SSL existente que desea asociar al nuevo gestor de claves personalizado. Puede crear una nueva configuración SSL, en lugar de asociar el gestor de claves personalizado a una configuración existente. Para obtener más información, consulte el siguiente ejemplo.
  10. Pulse Gestores de confianza y de claves en Propiedades adicionales.
  11. Seleccione el nuevo gestor de claves personalizado en la lista desplegable Gestor de claves. Si el nuevo gestor de claves personalizado no aparece en la lista, compruebe que ha seleccionado un ámbito de configuración SSL que está en el mismo nivel o un nivel inferior al ámbito que ha seleccionado en el paso 8.
  12. Pulse Aceptar y Guardar.

Resultados

Ha creado una configuración de gestor de claves personalizado que hace referencia a un archivo JAR del directorio de instalación de WebSphere Application Server y asocia la configuración personalizada a una configuración SSL durante el reconocimiento de la conexión.

Ejemplo

Desarrollo de un gestor de claves personalizado para la selección de claves SSL (Secure Sockets Layer) personalizadas. El ejemplo siguiente es un gestor de claves de ejemplo. Este sencillo gestor de claves devuelve el alias configurado si se establece utilizando las propiedades de alias com.ibm.ssl.keyStoreClientAlias o com.ibm.ssl.keyStoreServerAlias, según el extremo de la conexión del gestor de claves que se utilice. Si no se establecen estas propiedades, el gestor de claves se difiere al gestor de claves IbmX509 por omisión de JSSE para seleccionar un alias.

Después de crear y empaquetar un gestor de claves personalizado, puede configurarlo desde el archivo ssl.client.props para un cliente puro o mediante el enlace SSLConfiguration KeyManager de la consola administrativa. Consulte Control del gestor de claves de identidades del certificado X.509 para obtener información acerca de los gestores de claves.

Debido a que sólo se puede configurar un gestor de claves cada vez para una configuración SSL (Secure Sockets Layer) concreta, es posible que las selecciones de certificados en el extremo del servidor no funcionen como lo hacen cuando se especifica el gestor de claves IbmX509 por omisión. Cuando se configura un gestor de claves, es responsabilidad del propietario de dicho gestor de claves asegurarse de que se ha establecido correctamente la selección del alias en la configuración SSL proporcionada cuando se llama a chooseClientAlias o chooseServerAlias. Busque las propiedades SSL com.ibm.ssl.keyStoreClientAlias y com.ibm.ssl.keyStoreServerAlias.
Nota: Este ejemplo sólo se debe utilizar como un ejemplo y no está soportado.
package com.ibm.test;

import java.security.cert.X509Certificate;
import com.ibm.wsspi.ssl.KeyManagerExtendedInfo;

public final class CustomKeyManager 
		implements javax.net.ssl.X509KeyManager, com.ibm.wsspi.ssl.KeyManagerExtendedInfo
{
    private java.util.Properties props = null;
    private java.security.KeyStore ks = null;
    private javax.net.ssl.X509KeyManager km = null;
    private java.util.Properties sslConfig = null;
    private String clientAlias = null;
    private String serverAlias = null;
    private int clientslotnum = 0;
    private int serverslotnum = 0;

    public CustomKeyManager()
    {
    }

    /**
     * La ejecución de WebSphere Application Server llama a este método para establecer
     * las propiedades personalizadas.
     * 
     * @param java.util.Properties - custom props
     */
    public void setCustomProperties(java.util.Properties customProps)
    {
        props = customProps;
    }

    private java.util.Properties getCustomProperties()
    {
        return props;
    }

    /**
     * La ejecución de WebSphere Application Server llama a este método para
     * establecer las propiedades de configuración SSL establecidas para esta conexión.
     * 
     * @param java.util.Properties - contiene una propiedad para la configuración SSL.
     */
    public void setSSLConfig(java.util.Properties config)
    {
        sslConfig = config;                                   
    }

    private java.util.Properties getSSLConfig()
    {
        return sslConfig;
    }

    /**
     * La ejecución de WebSphere Application Server llama a este método para establecer el
     * X509KeyManager por omisión creado por IbmX509 KeyManagerFactory mediante la
     * información de KeyStore contenida en esta configuración SSL.  Esto permite delegar la
     * acción al gestor de claves IbmX509 por omisión.
     * 
     * @param javax.net.ssl.KeyManager defaultX509KeyManager - gestor de claves por omisión para IbmX509
     */
    public void setDefaultX509KeyManager(javax.net.ssl.X509KeyManager defaultX509KeyManager)
    {
        km = defaultX509KeyManager;
    }

    public javax.net.ssl.X509KeyManager getDefaultX509KeyManager()
    {
        return km;
    }

    /**
     * La ejecución de WebSphere Application Server llama a este método para
     * el almacén de claves SSL utilizado para esta conexión.
     * 
     * @param java.security.KeyStore - el almacén de claves configurado actualmente
     */
    public void setKeyStore(java.security.KeyStore keyStore)
    {
        ks = keyStore;
    }

    public java.security.KeyStore getKeyStore()
    {
        return ks;
    }

 /**
     * Método que llama el código personalizado para establecer el alias de servidor.
     * 
     * @param String - el alias de servidor que se ha de utilizar
     */
    public void setKeyStoreServerAlias(String alias)
    {
        serverAlias = alias;
    }

    private String getKeyStoreServerAlias()
    {
        return serverAlias;
    }

    /**
     * Método que llama el código personalizado para establecer el alias de cliente.
     * 
     * @param String - el alias de cliente que se ha de utilizar
     */
    public void setKeyStoreClientAlias(String alias)
    {
        clientAlias = alias;
    }
    
    private String getKeyStoreClientAlias()
    {
        return clientAlias;
    }

    /**
     * Método que llama el código personalizado para establecer el alias de cliente y la ranura (si es necesario)
     * 
     * @param String - el alias de cliente que se ha de utilizar
     * @param int - la ranura que se ha de utilizar (para hardware)
     */
    public void setClientAlias(String alias, int slotnum) throws Exception
    {
        if ( !ks.containsAlias(alias))
        {
            throw new IllegalArgumentException ( "Client alias " + alias + " 
            not found in keystore." );
        }
        this.clientAlias = alias;
        this.clientslotnum = slotnum;
    }

    /**
     * Método que llama el código personalizado para establecer el alias de servidor y la ranura (si es necesario)
     * 
     * @param String - el alias de servidor que se ha de utilizar
     * @param int - la ranura que se ha de utilizar (para hardware)
     */
    public void setServerAlias(String alias, int slotnum) throws Exception
    {
        if ( ! ks.containsAlias(alias))
        {
            throw new IllegalArgumentException ( "Server alias " + alias + " 
            not found in keystore." );
        }
        this.serverAlias = alias;
        this.serverslotnum = slotnum;
    }


    /**
     * La ejecución de JSSE llama a este método cuando necesita un alias para una conexión
     * de cliente que necesita un certificado de cliente.
     * 
     * @param String keyType
     * @param Principal[] issuers
     * @param java.net.Socket socket (no siempre está presente)
     */
    public String chooseClientAlias(String[] keyType, java.security.Principal[]
    issuers, java.net.Socket socket)
    {
        if (clientAlias != null && !clientAlias.equals(""))
        {
            String[] list = km.getClientAliases(keyType[0], issuers);
            String aliases = "";

            if (list != null)
            {
                boolean found=false;
                for (int i=0; i<list.length; i++)
                {
                    aliases += list[i] + " ";
                    if (clientAlias.equalsIgnoreCase(list[i]))
                        found=true;
                }

                if (found)
                {
                    return clientAlias;
                }

            }
        }
        
        // alias de cliente no encontrado, permitir selección del gestor de claves por omisión
        String[] keyArray = new String [] {keyType[0]};
        String alias = km.chooseClientAlias(keyArray, issuers, null);
        return alias.toLowerCase();
    }

    /**
     * La ejecución de JSSE llama a este método cuando necesita un alias para una conexión
     * de servidor para proporcionar la identidad del servidor.
     * 
     * @param String[] keyType
     * @param Principal[] issuers
     * @param java.net.Socket socket (no siempre está presente)
     */
    public String chooseServerAlias(String keyType, java.security.Principal[] 
    issuers, java.net.Socket socket)
    {
        if (serverAlias != null && !serverAlias.equals(""))
        {
            // obtener lista de alias del almacén de claves del gestor de claves por omisión
            String[] list = km.getServerAliases(keyType, issuers);
            String aliases = "";

            if (list != null)
            {
                boolean found=false;
                for (int i=0; i<list.length; i++)
                {
                    aliases += list[i] + " ";
                    if (serverAlias.equalsIgnoreCase(list[i]))
                        found = true;
                }

                if (found)
                {
                    return serverAlias;
                }
            }
        }

        // alias especificado no encontrado, permitir selección del gestor de claves por omisión
        String alias = km.chooseServerAlias(keyType, issuers, null);
        return alias.toLowerCase();
    }

    public String[] getClientAliases(String keyType, java.security.Principal[] issuers)
    {
        return km.getClientAliases(keyType, issuers);
    }

    public String[] getServerAliases(String keyType, java.security.Principal[] issuers)
    {
        return km.getServerAliases(keyType, issuers);
    }

    public java.security.PrivateKey getPrivateKey(String s)
    {
        return km.getPrivateKey(s);
    }

    public java.security.cert.X509Certificate[] getCertificateChain(String s)
    {
        return km.getCertificateChain(s);
    }

    public javax.net.ssl.X509KeyManager getX509KeyManager()
    {
        return km;
    }

}

Qué hacer a continuación

Puede crear un gestor de claves personalizado para un cliente puro. Para obtener más información, consulte el artículo Grupo de mandatos keyManagerCommands para el objeto AdminTask.

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=tsec_sslcreatecuskeymgr
File name: tsec_sslcreatecuskeymgr.html