Création d'un gestionnaire de clés personnalisé pour SSL
Vous pouvez créer une configuration de gestionnaire de clés personnalisée dans toutes les portées de gestion et associer le nouveau gestionnaire de clés à une configuration SSL (Secure Sockets Layer).
Avant de commencer
Pourquoi et quand exécuter cette tâche
Procédure
Résultats
Exemple
Développement d'un gestionnaire de clés personnalisé pour une sélection personnalisée de clés SSL (Secure Sockets Layer). L'exemple suivant illustre un gestionnaire de clés personnalisé. Ce gestionnaire de clés simple renvoie l'alias configuré s'il est défini à l'aide des propriétés d'alias com.ibm.ssl.keyStoreClientAlias ou com.ibm.ssl.keyStoreServerAlias, selon le côté de la connexion sur lequel le gestionnaire de clés est utilisé. Le gestionnaire de clés s'en remet au gestionnaire de clés IbmX509 JSSE par défaut pour sélectionner un alias si ces caractéristiques ne sont pas définies.
Après avoir créé et validé un gestionnaire de clés personnalisé, vous pouvez le configurer depuis le fichier ssl.client.props pour un client pur ou en utilisant le lien SSLConfiguration KeyManager dans la console d'administration. Pour de plus amples informations sur les gestionnaires de clés, voirContrôle des identités de certificat X.509 par le gestionnaire de clés.
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()
{
}
/**
* Méthode appelée par le module d'exécution WebSphere Application Server pour définir
* les propriétés.
*
* @param java.util.Properties - custom props
*/
public void setCustomProperties(java.util.Properties customProps)
{
props = customProps;
}
private java.util.Properties getCustomProperties()
{
return props;
}
/**
* Méthode appelée par le module d'exécution pour définir
* les propriétés de configuration SSL utilisées pour cette connexion.
*
* @param java.util.Properties - contient une propriété pour la configuration SSL.
*/
public void setSSLConfig(java.util.Properties config)
{
sslConfig = config;
}
private java.util.Properties getSSLConfig()
{
return sslConfig;
}
/**
* Méthode appelée par le module d'exécution WebSphere Application Server pour définir le
* X509KeyManager par défaut créé par IbmX509 KeyManagerFactory en utilisant les informations KeyStore
* présentes dans cette configuration SSL. Cela permet une délégation
* vers l'IbmX509 KeyManager par défaut.
*
* @param javax.net.ssl.KeyManager defaultX509KeyManager - gestionnaire de clés par défaut IbmX509
*/
public void setDefaultX509KeyManager(javax.net.ssl.X509KeyManager defaultX509KeyManager)
{
km = defaultX509KeyManager;
}
public javax.net.ssl.X509KeyManager getDefaultX509KeyManager()
{
return km;
}
/**
* Méthode appelée par le module d'exécution pour définir
* le KeyStore SSL utilisé pour cette connexion.
*
* @param java.security.KeyStore - le KeyStore actuellement configuré
*/
public void setKeyStore(java.security.KeyStore keyStore)
{
ks = keyStore;
}
public java.security.KeyStore getKeyStore()
{
return ks;
}
/**
* Méthode appelée par le code personnalisé pour définir l'alias du serveur.
*
* @param String - l'alias du serveur à utiliser
*/
public void setKeyStoreServerAlias(String alias)
{
serverAlias = alias;
}
private String getKeyStoreServerAlias()
{
return serverAlias;
}
/**
* Méthode appelée par le code personnalisé pour définir l'alias du client.
*
* @param String - l'alias du client à utiliser
*/
public void setKeyStoreClientAlias(String alias)
{
clientAlias = alias;
}
private String getKeyStoreClientAlias()
{
return clientAlias;
}
/**
* Méthode appelée par le code personnalisé pour définir l'alias et l'emplacement du client (si nécessaire).
*
* @param String - l'alias du client à utiliser
* @param int - l'emplacement à utiliser (pour le matériel)
*/
public void setClientAlias(String alias, int slotnum) throws Exception
{
if ( !ks.containsAlias(alias))
{
throw new IllegalArgumentException ( "Alias client " + alias + "
introuvable dans le fichier de clés." );
}
this.clientAlias = alias;
this.clientslotnum = slotnum;
}
/**
* Méthode appelée par le code personnalisé pour définir l'alias et l'emplacement du serveur (si nécessaire).
*
* @param String - l'alias du serveur à utiliser
* @param int - l'emplacement à utiliser (pour le matériel)
*/
public void setServerAlias(String alias, int slotnum) throws Exception
{
if ( ! ks.containsAlias(alias))
{
throw new IllegalArgumentException ( "Alias serveur " + alias + "
introuvable dans le fichier de clés." );
}
this.serverAlias = alias;
this.serverslotnum = slotnum;
}
/**
* Méthode appelée par le module d'exécution JSSE lorsqu'un alias est nécessaire
* pour une connexion client dans laquelle un certificat client est requis.
*
* @param String keyType
* @param Principal[] issuers
* @param java.net.Socket socket (pas toujours présente)
*/
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 client introuvable, laissez le gestionnaire de clés par défaut choisir.
String[] keyArray = new String [] {keyType[0]};
String alias = km.chooseClientAlias(keyArray, issuers, null);
return alias.toLowerCase();
}
/**
* Méthode appelée par le module d'exécution JSSE lorsqu'un alias est nécessaire à une
* connexion de serveur pour fournir l'identité du serveur.
*
* @param String[] keyType
* @param Principal[] issuers
* @param java.net.Socket socket (pas toujours présente)
*/
public String chooseServerAlias(String keyType, java.security.Principal[]
issuers, java.net.Socket socket)
{
if (serverAlias != null && !serverAlias.equals(""))
{
// Obtenir la liste des alias du fichier de clés depuis le gestionnaire de clés par défaut
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 spécifié introuvable, laissez le gestionnaire de clés par défaut choisir.
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;
}
}