SSL을 위한 사용자 정의 키 관리자 작성
사용자 정의 키 관리자 구성을 임의의 관리 범위에 작성하고 새 키 관리자를 SSL(Secure Sockets Layer) 구성과 연관시킬 수 있습니다.
시작하기 전에
이 태스크 정보
프로시저
결과
예
사용자 정의 SSL(Secure Sockets Layer) 키 선택을 위해 사용자 정의 키 관리자 개발. 다음 예는 샘플 사용자 정의 키 관리자의 예입니다. 이 단순 키 관리자는 별명 특성 com.ibm.ssl.keyStoreClientAlias 또는 com.ibm.ssl.keyStoreServerAlias를 사용하여 설정된 경우에는 연결의 어떤 측면에 키 관리자가 사용되는지에 따라 구성된 별명을 리턴합니다. 키 관리자는 이러한 특성이 설정되지 않은 경우에는 별명을 선택하기 위해 JSSE 기본 IbmX509 키 관리자를 따릅니다.
사용자 정의 키 관리자를 빌드하고 패키지한 후에는 순수한 클라이언트의 경우 ssl.client.props 파일로부터 이를 구성하거나 관리 콘솔에서 SSLConfiguration KeyManager 링크를 사용하여 이를 구성할 수 있습니다. 키 관리자에 대한 자세한 정보는 X.509 인증서 ID의 키 관리자 제어의 내용을 참조하십시오.
지정된 SSL(Secure Sockets Layer) 구성에 대해 키 관리자는 한 번에 하나만 구성될 수 있으므로
서버측의 인증서 선택사항은 기본 IbmX509 키 관리자가 지정될 때처럼 작동하지 않을 수도 있습니다.
사용자 정의 키 관리자가 구성되면, 제공된 SSL 구성으로부터 별명의 선택이 chooseClientAlias 또는 chooseServerAlias가
호출될 때 제대로 설정되었는지 확인하는 것은 해당 키 관리자의 소유자에 달려 있습니다.
com.ibm.ssl.keyStoreClientAlias 및 com.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;
}
}