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协议的网络连接。