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

Sie müssen eine JAR-Datei für einen angepassten Key-Manager im Verzeichnis was.install.root/lib/ext von WebSphere Application Server entwickeln, packen und lokalisieren.

Informationen zu diesem Vorgang

Führen Sie in der Administrationskonsole die folgenden Schritte aus:

Vorgehensweise

  1. Legen Sie fest, ob Sie den angepassten Key-Manager auf Zellenebene oder auf einer untergeordneten Ebene, z. B. Knoten-, Server- oder Clusterebene, erstellen möchten.
    Wichtig: Wenn Sie einen angepassten Key-Manager auf einer Ebene unterhalb der Zellenebene erstellen möchten, können Sie ihn nur einer SSL-Konfiguration derselben oder einer höheren Ebene zuordnen. Für SSL-Konfiguration in unteren Ebenen als der Key-Manager ist die Key-Manager-Konfiguration nicht sichtbar.
    • Klicken Sie zum Erstellen eines angepassten Key-Manager auf Zellenebene auf Sicherheit > Verwaltung von SSL-Zertifikaten und Schlüsseln > Key-Manager. Alle SSL-Konfigurationen in der Zelle können den Key-Manager auf Zellenebene auswählen.
    • Klicken Sie zum Erstellen eines angepassten Key-Manager auf einer der Zellenebene untergeordneten Ebene auf Sicherheit > Verwaltung von SSL-Zertifikaten und Schlüsseln > Sicherheitskonfigurationen für Endpunkte verwalten > {Eingehend | Abgehend} > SSL-Konfiguration > Key-Manager.
  2. Klicken Sie auf Neu, um einen neuen Key-Manager zu erstellen.
  3. Geben Sie den eindeutigen Namen für den Key-Manager ein.
  4. Wählen Sie die Implementierungseinstellung Angepasst aus. Mit der angepassten Einstellung können Sie eine Java™-Klasse definieren, die eine Implementierung in der Java-Schnittstelle "javax.net.ssl.X509KeyManager" und optional der Schnittstelle "com.ibm.wsspi.ssl.KeyManagerExtendedInfo" von WebSphere Application Server hat. Die Standardimplementierungseinstellung gilt nur, wenn der Key-Manager in der Liste der Java-Sicherheitsprovider bereits als Provider und Algorithmus definiert ist. Dies ist bei einem angepassten Key-Manager jedoch nicht der Fall. Ein typischer Standard-Key-Manager ist algorithm = IbmX509, provider = IBMJSSE2.
  5. Geben Sie einen Klassenname ein. Beispiel: com.ibm.test.CustomKeyManager.
  6. Wählen Sie eine der folgenden Aktionen aus:
    • Klicken Sie auf Anwenden und anschließend unter "Weitere Eigenschaften" auf Angepasste Eigenschaften, um dem neuen angepassten Key-Manager angepasste Eigenschaften hinzuzufügen. Nachdem Sie die gewünschten angepassten Eigenschaften hinzugefügt haben, klicken Sie auf OK und Speichern. Fahren Sie anschließend mit dem nächsten Schritt fort.
    • Klicken Sie auf OK und Speichern. Fahren Sie anschließend mit dem nächsten Schritt fort.
  7. Klicken Sie in der Seitennavigation auf Verwaltung von SSL-Zertifikaten und Schlüsseln.
  8. Wählen Sie eine der folgenden Aktionen aus:
    • Klicken Sie unter "Zugehörige Elemente" für eine zellenbezogene SSL-Konfiguration auf SSL-Konfigurationen.
    • Klicken Sie auf Sicherheitskonfigurationen für Endpunkte verwalten, um eine SSL-Konfiguration auf einer unteren Ebene auszuwählen.
  9. Klicken Sie auf den Link für die vorhandene SSL-Konfiguration, die Sie dem neuen angepassten Key-Manager hinzufügen möchten. Sie können eine neue SSL-Konfiguration erstellen, anstatt dem angepassten Key-Manager eine vorhandene Konfiguration zuzuordnen. Weitere Informationen finden Sie im folgenden Beispiel.
  10. Klicken Sie unter "Weitere Eigenschaften" auf Trust- und Key-Manager.
  11. Wählen Sie den neuen angepassten Key-Manager in der Dropdown-Liste Key-Manager aus. Wenn der neue angepasste Key-Manager nicht in der Liste aufgeführt ist, vergewissern Sie sich, dass Sie eine SSL-Konfigurationsebene ausgewählt haben, die der in Schritt 8 ausgewählten Ebene entspricht bzw. dieser untergeordnet ist.
  12. Klicken Sie auf OK und Speichern.

Ergebnisse

Sie haben eine angepasste Key-Manager-Konfiguration erstellt, die auf eine JAR-Datei im Installationsverzeichnis von WebSphere Application Server verweist und diese angepasste Konfiguration während des Verbindungshandshake einer SSL-Konfiguration zuordnet.

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.

Da für eine gegebene SSL-Konfiguration immer nur ein Key Manager zur Zeit konfiguriert werden kann, funktioniert die Zertifikatauswahl auf der Serverseite möglicherweise nicht wie gewünscht, wenn der IbmX509-Standard-Key-Manager angegeben ist. Wenn ein eigener Key Manager konfiguriert ist, muss der Eigner dieses Key Manager sicherstellen, dass die Auswahl des Aliasnamens aus der bereitgestellten SSL-Konfiguration beim Aufruf von chooseClientAlias oder chooseServerAlias ordnungsgemäß definiert ist. Achten Sie auf die SSL-Eigenschaften com.ibm.ssl.keyStoreClientAlias und com.ibm.ssl.keyStoreServerAlias.
Anmerkung: Dieses Beispiel dient nur zur Information und wird nicht unterstützt.
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;
    }

}

Nächste Schritte

Sie können einen angepassten Key-Manager für einen reinen Client erstellen. Weitere Informationen finden Sie im Artikel "Befehlsgruppe 'keyManagerCommands' für das Objekt 'AdminTask'".

Symbol, das den Typ des Artikels anzeigt. Taskartikel



Symbol für Zeitmarke Letzte Aktualisierung: 25.05.2016
http://www14.software.ibm.com/webapp/wsbroker/redirect?version=cord&product=was-nd-mp&topic=tsec_sslcreatecuskeymgr
Dateiname:tsec_sslcreatecuskeymgr.html