为 SSL 创建定制密钥管理器

您可以在任何管理范围中创建定制密钥管理器配置并使新的密钥管理器与安全套接字层 (SSL) 配置相关联。

开始之前

必须在 WebSphere® Application Server 上为定制密钥管理器开发并打包 Java™ 归档 (.JAR) 文件,然后将该文件放置在 was.install.root/lib/ext 目录中。

关于此任务

在管理控制台中完成下列步骤:

过程

  1. 决定您要在单元范围中还是在单元范围之下的节点、服务器或集群中创建定制密钥管理器,例如:
    要点: 当您在单元范围之下的某个级别创建定制密钥管理器时,您可以使它仅与同一范围或更高级别的范围的安全套接字层 (SSL) 配置相关联。范围低于密钥管理器的 SSL 配置看不到密钥管理器配置。
    • 要在单元范围中创建定制密钥管理器,请单击安全性 > SSL 证书和密钥管理 > 密钥管理器。单元中的每个 SSL 配置都可以选择单元范围中的密钥管理器。
    • 要在单元级别下的范围中创建定制密钥管理器,请单击安全性 > SSL 证书和密钥管理 > 管理端点安全性配置 > {入站 | 出站} > SSL_configuration > 密钥管理器
  2. 单击新建以创建新的密钥管理器。
  3. 输入唯一密钥管理器名。
  4. 选择定制实现设置。 使用定制设置,可以定义实现了 Java 接口 javax.net.ssl.X509KeyManager 和 com.ibm.wsspi.ssl.KeyManagerExtendedInfo WebSphere Application Server 接口(可选)的 Java 类。仅当在 Java 安全提供程序列表中已将密钥管理器定义为提供程序和算法时,标准实现设置才适用,此情况不适用于定制密钥管理器。典型的标准密钥管理器算法 = IbmX509,提供程序 = IBMJSSE2
  5. 输入类名。例如,com.ibm.test.CustomKeyManager。
  6. 选择下列某项操作:
    • 单击应用,然后单击“其他属性”下的定制属性,以将定制属性添加到新的定制密钥管理器。当您完成添加定制属性时,请单击确定保存,然后转至下一个步骤。
    • 单击确定保存,然后转至下一个步骤。
  7. 在页面导航中单击 SSL 证书和密钥管理
  8. 选择下列某项操作:
    • 对于限于单元范围的 SSL 配置,在“相关项”下,单击 SSL 配置
    • 单击管理端点安全性配置以在更低级别的范围选择 SSL 配置。
  9. 单击要与新的定制密钥管理器相关联的现有 SSL 配置的链接。 您可以创建新的 SSL 配置,而不是使定制密钥管理器与现有配置相关联。有关更多信息,请参阅以下示例。
  10. 在“其他属性”下,单击信任和密钥管理器
  11. 密钥管理器下拉列表中选择新的定制密钥管理器。 如果未列示新的定制密钥管理器,请验证您选择的 SSL 配置范围的级别与在步骤 8 中选择的范围级别是相同还是更低。
  12. 单击确定,然后单击保存

结果

您已创建定制密钥管理器配置,它引用 WebSphere Application Server 安装目录中的 JAR 文件,并在连接握手期间使定制配置与 SSL 配置相关联。

示例

开发定制密钥管理器以便选择定制安全套接字层密钥。 以下示例是样本定制密钥管理器。如果已配置的别名是使用别名属性 com.ibm.ssl.keyStoreClientAlias 或 com.ibm.ssl.keyStoreServerAlias 设置的(这取决于密钥管理器使用哪一端连接),那么此简单密钥管理器将返回该别名。如果未设置这些属性,那么密钥管理器将推迟到由 JSSE 缺省 IbmX509 密钥管理器来选择别名。

在构建定制密钥管理器并将其打包后,可在纯客户机的 ssl.client.props 文件中配置它,或者通过使用管理控制台中的 SSLConfiguration KeyManager 链接来配置它。有关密钥管理器的更多信息,请参阅密钥管理器对 X.509 证书标识的控制

因为对于任何指定的安全套接字层 (SSL) 配置,一次只能配置一个密钥管理器,所以在服务器端所作的证书选择不会像指定缺省 IbmX509 密钥管理器那样起作用。配置定制密钥管理器之后,由密钥管理器的所有者确保在调用 chooseClientAliaschooseServerAlias 时,提供的 SSL 配置中选择的别名进行了正确设置。查找 com.ibm.ssl.keyStoreClientAliascom.ibm.ssl.keyStoreServerAlias SSL 属性。
注: 此示例仅应用作示例,并且不受支持。
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;
    }

}

下一步做什么

您可以为纯客户机创建定制密钥管理器。有关更多信息,请参阅“AdminTask 对象的 keyManagerCommands 命令组”主题。

指示主题类型的图标 任务主题



时间戳记图标 最近一次更新时间: last_date
http://www14.software.ibm.com/webapp/wsbroker/redirect?version=cord&product=was-nd-mp&topic=tsec_sslcreatecuskeymgr
文件名:tsec_sslcreatecuskeymgr.html