3.6.3 SSLContext
SSLContext类用于表示安全套接字上下文,它同样是一个引擎类。
/此类的实例表示安全套接字协议的实现,它充当用于安全套接字工厂或SSLEngine的工厂。用可选的一组密钥和信任管理器及安全随机字节源初始化此类。/
public class SSLContext
extends Object
❑方法详述
SSLContext类需要通过getInstance()工厂方法获得实例化对象。
一种最为常用的方式只需指定协议名称,方法如下所示:
//返回实现指定安全套接字协议的SSLContext对象。
public static SSLContext getInstance(String protocol)
另一种方式需要指定协议名称的同时指定该协议的提供者,方法如下所示:
//返回实现指定安全套接字协议的SSLContext对象。
public static SSLContext getInstance(String protocol, Provider provider)
//返回实现指定安全套接字协议的SSLContext对象。
public static SSLContext getInstance(String protocol, String provider)
获得实例化对象后,需要通过以下方法完成初始化:
//初始化此上下文。
publi c final void init(KeyManager[]km, TrustManager[]tm, SecureRandom random)
在完成初始化操作后,我们就可以获得该上下文中的属性,在本书中最为常用的是以下几种方法:
//返回此上下文的ServerSocketFactory对象。
public final SSLServerSocketFactory getServerSocketFactory()
//返回此上下文的SocketFactory对象。
public final SSLSocketFactory getSocketFactory()
有关SSLSessionContext类相关内容,读者可以参考相关Java API文档,以下方法提供了获得服务器端/客户端SSLSessionContext对象实现:
/返回服务器会话上下文,它表示可供服务器端SSL套接字握手阶段所使用的SSL会话集。/
public final SSLSessionContext getServerSessionContext()
/返回客户端会话上下文,它表示可供客户端SSL套接字握手阶段所使用的SSL会话集。/
public final SSLSessionContext getClientSessionContext()
有关SSLEngine类的相关内容,读者可以参考相关的Java API文档,以下方法提供了创建SSLEngine对象实现:
//使用此上下文创建新的SSLEngine。
public final SSLEngine createSSLEngine()
//使用此上下文创建新的SSLEngine,并绑定主机和端口。
public final SSLEngine createSSLEngine(String peerHost, int peerPort)
以下方法用于设置/获得默认SSL上下文:
//设置默认的SSL上下文
public synchronized static void setDefault(SSLContext context)
//返回默认的SSL上下文
public synchronized static SSLContext getDefault()
以下方法用于设置/获得默认SSL参数:
//返回表示此SSL上下文默认设置的SSLParameters的副本。
public final SSLParameters getDefaultSSLParameters()
//返回表示此SSL上下文受支持设置的SSLParameters的副本。
public final SSLParameters getSupportedSSLParameters()
SSLContext类作为引擎类,提供了以下方法:
//返回此SSLContext对象的协议名称。
public final String getProtocol()
//返回此SSLContext对象的提供者。
public final Provider getProvider()
❑实现示例
我们通过代码清单3-28来展示如何使用KeyMangagerFactory、TrustmanagerFactory、SSLContext和SSLSocektFactory类。
代码清单3-28 构建SSLSocketFactory
/**
*获得KeyStore
*
*@param keyStorePath
*@param password
*@return
*@throws Exception
*/
private static KeyStore getKeyStore(String keyStorePath, String password)throws Exception{
//获得密钥库文件输入流
FileInputStream is=new FileInputStream(keyStorePath);
//实例化密钥库
KeyStore ks=KeyStore.getInstance("JKS");
//加载密钥库
ks.load(is, password.toCharArray());
//关闭流
is.close();
return ks;
}
/**
*获得SSLSocektFactory
*@param password
*
密码
*@param keyStorePath
*
密钥库路径
*@param trustKeyStorePath
*
信任库路径
*@return
*@throws Exception
*/
private static SSLSocketFactory getSSLSocketFactory(String password, String
keyStorePath, String trustKeyStorePath)throws Exception{
//初始化密钥库
KeyManagerFactory keyManagerFactory=KeyManagerFactory.getInstance
("SunX509");
KeyStore keyStore=getKeyStore(keyStorePath, password);
keyManagerFactory.init(keyStore, password.toCharArray());
//初始化信任库
TrustManagerFactory trustManagerFactory=TrustManagerFactory.getInstance
("SunX509");
KeyStore trustkeyStore=getKeyStore(trustKeyStorePath, password);
trustManagerFactory.init(trustkeyStore);
//初始化SSL上下文
SSLContext ctx=SSLContext.getInstance("SSL");
ctx.init(keyManagerFactory.getKeyManagers(),trustManagerFactory.
getTrustManagers(),null);
SSLSocketFactory sf=ctx.getSocketFactory();
return sf;
}
至此,我们完成了构建HTTPS协议的准备工作。接下来我们将构建一个基于HTTPS协议的网络连接。