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.

Vorbereitungen

Sie müssen eine Java™-Archivdatei (.JAR) für einen benutzerdefinierten Schlüsselmanager imwas.install.root/lib/extVerzeichnis auf WebSphere® Application Server.

Informationen zu dieser Task

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 Schlüsselmanager auf einer Ebene unterhalb des Zellenbereichs erstellen, können Sie ihn nur mit einer SSL-Konfiguration (Secure Sockets Layer) auf demselben oder einem höheren Bereich verknüpfen. 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 Neu um einen neuen Schlüssel-Manager zu erstellen.
  3. Geben Sie den eindeutigen Namen für den Key-Manager ein.
  4. Wähle aus Brauch Implementierungseinstellung.
    Mit der benutzerdefinierten Einstellung können Sie eine Java-Klasse definieren, die eine Implementierung auf der Java-Schnittstelle hat javax.net.ssl.X509KeyManager und optional die com.ibm.wsspi.ssl.KeyManagerExtendedInfo WebSphere Application Server Schnittstelle. Die Standardimplementierungseinstellung gilt nur, wenn der Schlüsselmanager bereits in der Liste der Java-Sicherheitsanbieter als Anbieter und Algorithmus definiert ist, was bei einem benutzerdefinierten Schlüsselmanager nicht der Fall ist. Der typische Standard-Schlüsselmanager istalgorithm = 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 SSL-Zertifikat und Schlüsselverwaltung in der Seitennavigation.
  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 Vertrauens- und Schlüsselmanager unter „Weitere Eigenschaften“.
  11. Wählen Sie den neuen benutzerdefinierten Schlüsselmanager im Schlüsselmanager Dropdown-Liste.
    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 OK Und Speichern.

Ergebnisse

Sie haben eine benutzerdefinierte Schlüsselmanagerkonfiguration erstellt, die auf eine JAR-Datei im Installationsverzeichnis von WebSphere Application Server und verknüpft die benutzerdefinierte Konfiguration während des Verbindungs-Handshakes mit einer SSL-Konfiguration.

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 benutzerdefinierten Schlüsselmanager erstellt und verpackt haben, können Sie ihn entweder über denssl.client.propsDatei für einen reinen Client oder durch Verwendung der SSLConfiguration KeyManager in der Verwaltungskonsole. Sehen Kontrolle durch Schlüsselmanager über X.509 Zertifikatsidentitäten für weitere Informationen zu Schlüsselmanagern.

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 benutzerdefinierter Schlüsselmanager konfiguriert ist, liegt es in der Verantwortung des Eigentümers dieses Schlüsselmanagers, sicherzustellen, dass die Auswahl des Alias aus der bereitgestellten SSL-Konfiguration richtig eingestellt ist, wennchooseClientAliasoderchooseServerAliaswerden genannt. Suche nachcom.ibm.ssl.keyStoreClientAliasundcom.ibm.ssl.keyStoreServerAliasSSL-Eigenschaften.
Notiz: Dieses Beispiel sollte nur als Muster verwendet werden 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()
    {
    }

    /**
     * Method called by WebSphere Application Server runtime to set the custom
     * properties.
     * 
     * @param java.util.Properties - custom props
     */
    public void setCustomProperties(java.util.Properties customProps)
    {
        props = customProps;
    }

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

    /**
     * Method called by WebSphere Application Server runtime to set the SSL
     * configuration properties being used for this connection.
     * 
     * @param java.util.Properties - contains a property for the SSL configuration.
     */
    public void setSSLConfig(java.util.Properties config)
    {
        sslConfig = config;                                   
    }

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

    /**
     * Method called by WebSphere Application Server runtime to set the default
     * X509KeyManager created by the IbmX509 KeyManagerFactory using the KeyStore
     * information present in this SSL configuration.  This allows some delegation
     * to the default IbmX509 KeyManager to occur.
     * 
     * @param javax.net.ssl.KeyManager defaultX509KeyManager - default key manager for IbmX509
     */
    public void setDefaultX509KeyManager(javax.net.ssl.X509KeyManager defaultX509KeyManager)
    {
        km = defaultX509KeyManager;
    }

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

    /**
     * Method called by WebSphere Application Server runtime to set the SSL
     * KeyStore used for this connection.
     * 
     * @param java.security.KeyStore - the KeyStore currently configured
     */
    public void setKeyStore(java.security.KeyStore keyStore)
    {
        ks = keyStore;
    }

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

 /**
     * Method called by custom code to set the server alias.
     * 
     * @param String - the server alias to use
     */
    public void setKeyStoreServerAlias(String alias)
    {
        serverAlias = alias;
    }

    private String getKeyStoreServerAlias()
    {
        return serverAlias;
    }

    /**
     * Method called by custom code to set the client alias.
     * 
     * @param String - the client alias to use
     */
    public void setKeyStoreClientAlias(String alias)
    {
        clientAlias = alias;
    }
    
    private String getKeyStoreClientAlias()
    {
        return clientAlias;
    }

    /**
     * Method called by custom code to set the client alias and slot (if necessary).
     * 
     * @param String - the client alias to use
     * @param int - the slot to use (for 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;
    }

    /**
     * Method called by custom code to set the server alias and slot (if necessary).
     * 
     * @param String - the server alias to use
     * @param int - the slot to use (for 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;
    }


    /**
     * Method called by JSSE runtime to when an alias is needed for a client
     * connection where a client certificate is required.
     * 
     * @param String keyType
     * @param Principal[] issuers
     * @param java.net.Socket socket (not always present)
     */
    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;
                }

            }
        }
        
        // client alias not found, let the default key manager choose.
        String[] keyArray = new String [] {keyType[0]};
        String alias = km.chooseClientAlias(keyArray, issuers, null);
        return alias.toLowerCase();
    }

    /**
     * Method called by JSSE runtime to when an alias is needed for a server
     * connection to provide the server identity.
     * 
     * @param String[] keyType
     * @param Principal[] issuers
     * @param java.net.Socket socket (not always present)
     */
    public String chooseServerAlias(String keyType, java.security.Principal[] 
    issuers, java.net.Socket socket)
    {
        if (serverAlias != null && !serverAlias.equals(""))
        {
            // get the list of aliases in the keystore from the default key manager
            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;
                }
            }
        }

        // specified alias not found, let the default key manager choose.
        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'".