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
Acerca de esta tarea
Procedimiento
Resultados
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.
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;
}
}