Angepassten Key-Manager für SSL erstellen
Sie können eine angepasste Key-Manager-Konfiguration auf jeder Verwaltungsebene erstellen und den neuen Key-Manager einer SSL-Konfiguration zuordnen.
Vorbereitende Schritte
Informationen zu diesem Vorgang
Vorgehensweise
Ergebnisse
Beispiel
Eigenen Key Manager für Auswahl angepasster SSL-Schlüssel entwickeln. Das folgende Beispiel stammt von einem angepassten Key Manager. Dieser einfache Key-Manager gibt den konfigurierten Alias zurück, wenn dieser mit der Aliaseigenschaft "com.ibm.ssl.keyStoreClientAlias" bzw. "com.ibm.ssl.keyStoreServerAlias" gesetzt wurde, je nachdem, auf welcher Seite der Verbindung der Key Manager verwendet wird. Der Key-Manager überträgt die Auswahl eines Alias an den JSSE-IbmX509-Standard-Key-Manager, wenn diese Eigenschaften nicht gesetzt sind.
Nachdem Sie einen eigenen Key Manager erstellt und gepackt haben, können Sie ihn für einen reinen Client mit der Datei ssl.client.props konfigurieren oder über den Link SSLConfiguration KeyManager in der Administrationskonsole. Nähere Informationen zu Key Managern finden Sie im Artikel Steuerung von X.509-Zertifikatidentitäten mit einem Key Manager.
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()
{
}
/**
* Methode, die von der Laufzeitumgebung von WebSphere Application Server aufgerufen wird, um
* die angepassten Eigenschaften zu definieren.
*
* @param java.util.Properties - angepasste Eigenschaften
*/
public void setCustomProperties(java.util.Properties customProps)
{
props = customProps;
}
private java.util.Properties getCustomProperties()
{
return props;
}
/**
* Von der WAS-Laufzeit aufgerufene Methode zum Setzen der SSL-
* Konfigurationseigenschaften für diese Verbindung
*
* @param java.util.Properties - Enthält eine Eigenschaft für die SSL-Konfiguration.
*/
public void setSSLConfig(java.util.Properties config)
{
sslConfig = config;
}
private java.util.Properties getSSLConfig()
{
return sslConfig;
}
/**
* Von der WAS-Laufzeit aufgerufene Methode zum Setzen des X509KeyManager, der
* von der IbmX509-KeyManagerFactory mit den Keystore-Informationen aus dieser
* SSL-Konfiguration erstellt wurde. Dies ermöglicht eine teilweise
* Delegierung an den IbmX509-Standard-Key-Manager.
*
* @param javax.net.ssl.KeyManager defaultX509KeyManager - Standard-Key-Manager für IbmX509
*/
public void setDefaultX509KeyManager(javax.net.ssl.X509KeyManager defaultX509KeyManager)
{
km = defaultX509KeyManager;
}
public javax.net.ssl.X509KeyManager getDefaultX509KeyManager()
{
return km;
}
/**
* Von der WAS-Laufzeit aufgerufene Methode zum Festlegen des SSL-
* Keystore für diese Verbindung
*
* @param java.security.KeyStore - derzeit konfigurierter Keystore
*/
public void setKeyStore(java.security.KeyStore keyStore)
{
ks = keyStore;
}
public java.security.KeyStore getKeyStore()
{
return ks;
}
/**
* Vom angepassten Code aufgerufene Methode zum Setzen des Serveralias
*
* @param String - zu verwendender Serveralias
*/
public void setKeyStoreServerAlias(String alias)
{
serverAlias = alias;
}
private String getKeyStoreServerAlias()
{
return serverAlias;
}
/**
* Vom angepassten Code aufgerufene Methode zum Setzen des Clientalias
*
* @param String - zu verwendender Clientalias
*/
public void setKeyStoreClientAlias(String alias)
{
clientAlias = alias;
}
private String getKeyStoreClientAlias()
{
return clientAlias;
}
/**
* Vom angepassten Code aufgerufene Methode zum Setzen des Clientalias und ggf. des Client-Slots
*
* @param String - zu verwendender Clientalias
* @param int - zu verwendender Slot (für 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;
}
/**
* Vom angepassten Code aufgerufene Methode zum Setzen des Serveralias und ggf. des Server-Slots
*
* @param String - zu verwendender Serveralias
* @param int - zu verwendender Slot (für 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;
}
/**
* Von der JSSE-Laufzeit aufgerufene Methode, wenn ein Aliasname für eine Clientverbindung
* mit erforderlichem Clientzertifikat benötigt wird
*
* @param String keyType
* @param Principal[] issuers
* @param java.net.Socket socket (nicht immer vorhanden)
*/
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;
}
}
}
// Clientalias nicht gefunden; Standard-Key-Manager auswählen lassen
String[] keyArray = new String [] {keyType[0]};
String alias = km.chooseClientAlias(keyArray, issuers, null);
return alias.toLowerCase();
}
/**
* Von der JSSE-Laufzeit aufgerufene Methode, wenn ein Aliasname für eine Serververbindung
* zur Angabe der Serveridentität erforderlich ist
*
* @param String[] keyType
* @param Principal[] issuers
* @param java.net.Socket socket (nicht immer vorhanden)
*/
public String chooseServerAlias(String keyType, java.security.Principal[]
issuers, java.net.Socket socket)
{
if (serverAlias != null && !serverAlias.equals(""))
{
// Liste der Aliasnamen im Keystore vom Standard-Key-Manager abrufen
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;
}
}
}
// angegebenen Aliasnamen nicht gefunden; Standard-Key-Manager auswählen lassen
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;
}
}