论文部分内容阅读
摘要:从网络数据传输的安全性问题出发,研究了SSL运行机理和JSSE的框架及API,设计了一个应用JSSE建立安全连接的原型,并以实例验证其有效性。
关键词:安全套接字层;Java安全套接字扩展;工厂模式
中图分类号:TP393文献标识码:A文章编号:1009-3044(2008)08-10ppp-0c
1 SSL
随着计算机网络的日益普及,如何保证数据在网络上安全传输已成为一项基础性技术。安全套接字层(Secure Sockets Layer, SSL)[1]由Netscape公司开发,是目前最具代表性,应用最为广泛的网络安全传输协议。它位于TCP/IP协议层与各种应用层协议之间,如图1所示:
因此,SSL可以广泛地应用在各种形式的网络传输中。例如使用浏览器访问安全站点所用的HTTPS协议就是SSL对HTTP协议的封装。SSL分为两层协议,底层是SSL记录协议,提供基本的安全服务;高层是握手协议、修改密文协议和告警协议,用于处理应用程序凭证的交换和验证[2]。SSL基于数字证书技术建立安全传输信道,其过程大致如下:(1)客户端与服务器交换SSL版本号等初始信息;(2)客户端与服务器相互验证对方证书(客户端验证为可选);(3)利用对方证书共同产生会话密钥;(4)利用会话密钥对后续的数据进行加、解密。
2 JSSE
JSSE(Java Secure Socket Extension,Java安全套接字扩展)是SUN公司所开发的对SSL的参考实现。从J2SE v1.4版本开始,JSSE成为JDK的标准组件,并纳入了J2EE规范[3]。在JSSE中包含了数据加密,服务器验证,消息完整性和客户端验证等技术,可以在客户机和服务器之间建立起一条SSL安全数据传输链路。为了方便应用程序开发者的使用,JSSE提供了一个可扩充的框架和一组Java API,主要包括:
(1)SSLSocketFactory和SSLServerSocketFactory:分别用来产生客户端和服务端的SSL套接字的工厂类。
(2)SSLSocket和SSLServerSocket:分别是客户端和服务端的SSL套接字,它们是java.net.Socket的子类。一个Socket代表TCP双向通信连接的一个端点,SSLSocket和SSLServerSocket总是成对出现。
(3)SSLSession:代表客户端与服务端的一次会话。它保存了会话期间的会话密钥,并提供相应的加、解密组件。
(4)HandShakeCompletedListener:网络监听器,负责监听客户端与服务端之间的“握手”事件(HandShakeCompletedEvent对象)。
(5)X509Certificate:客户端与服务端默认采用公钥体系的数字证书,即:X.509数字证书。X509Certificate对象提供了对X.509数字证书的访问机制。
(6)KeyManager和KeyManagerFactory:创建、存储和管理证书的工厂类及证书管理器对象。在建立SSL安全连接时,客户端和服务端需分别产生自身的证书并发送到对方验证。
(7)TrustManager和TrustManagerFactory:管理、验证通信对方的数字证书的工厂类及证书管理器对象,只有通过验证方可建立SSL安全连接。
可以看出,在JSSE中广泛采用了“工厂模式”(Factory Method),从而使得JSSE框架具备了良好的扩展性。其他软件开发者或应用提供商可以在JSSE规范下自行开发面向特定应用的具体实现。在JDK发布包中,SUN公司提供了自己开发的默认实现:SunJSSE。
3 建立安全连接
基于JSSE在客户机与服务器之间建立SSL安全连接可以分为四步:①为客户机与服务器分别建立X.509数字证书,并相互信任;②建立服务端的SSLServerSocket,并启动;③建立客户端的SSLSocket,并启动;④数据通信。
3.1 创建数字证书
在Java中可采用KeyStore(密钥仓库)技术来创建和存储X.509数字证书。KeyStore中可以存储两类不同的项,密钥项(Key Entry)存储极为敏感的加密密钥信息,由JSSE中的密钥管理器类(KeyManager)管理;可信任证书项(Trusted Certificate Entry)存储另一个对象的公钥证书,由JSSE中的可信任证书管理器类(TrustManager)管理[4]。
在Java中创建、存储、管理数字证书的方法有两种。一是通过keytool工具手工操作,实现简单,但操作繁琐,并且无法动态控制证书信息;二是通过JSSE的API,采用程序自动生成并动态管理。在本文所设计的安全连接原型中采用第二种方式,其关键过程如下:
// 创建工厂对象.
String alg=KeyManagerFactory.getDefaultAlgorithm();
KeyManagerFactory kmf=KeyManagerFactory.getInstance(alg);
// 动态创建KeyStore文件
FileInputStream fis=new FileInputStream(keyStore);
KeyStore ks=KeyStore.getInstance("jks");
ks.load(new FileInputStream(keyStore), keyPwd.toCharArray());
// 使用KeyStore初始化工厂对象
kmFact.init(ks, keyPwd.toCharArray());
// 创建证书对象数组
KeyManager[] kms=kmf.getKeyManagers();
实例中采用默认算法生成证书,也可根据需要选择其它的证书生成算法。可信任证书对象(TrustManager)的创建与此类似,不再赘述。
3.2 建立服务端与客户端Socket
当通信双方的证书创建后,可以用SSLSocketFactory和SSLServerSocketFactory分别创建客户端与服务端的Socket,验证对方证书并建立安全连接。
首先创建服务端Socket:
// 创建默认工厂对象
SSLServerSocketFactory ssf=
(SSLServerSocketFactory)SSLServerSocketFactory.getDefault();
// 创建套接字对象
SSLServerSocket serverSocket=(SSLServerSocket)ssf.createServerSocket(port);
// 指定双向验证(可选)
serverSocket.setNeedClientAuth(true);
// 监听连接请求
SSLSocket socket=(SSLSocket)serverSocket.accept();
// 创建网络监听器 对客户端证书授权验证.
HandshakeCompletedListener hcl=new MyHandshakeListener(ident);
socket.addHandshakeCompletedListener(hcl);
其中MyHandshakeListener是自定义的一个实现HandshakeCompletedListener的对象,负责实现SSL的握手协议,采用X.509证书对象(X509Certificate)验证通信对方的证书[5] [6] [7]。客户端Socket的建立与此类似,不再赘述。
3.3 数据通信
Socket建立后,客户端与服务端可通过流方式(Stream)传输数据,监听器在通信双方实时对数据进行加、解密,保证网络连路上数据的安全性。
4 结束语
由于TCP/IP网络的固有缺陷,通过网络传输数据存在很大的安全隐患。SSL协议基于数字证书为网络上通信双方建立了一条安全的传输信道。SUN公司提出的JSSE技术是SSL协议的具体实现,为软件开发者设计SSL应用提供了极大的便利。特别是JSSE基于工厂模式的架构,可方便地扩充各种个性化的SSL实现。
本文简要阐述了SSL的运行机理,具体研究了JSSE的框架和各种API,并应用JSSE设计了客户端与服务端之间SSL连接的原型,通过实例运行验证了原型的正确性。接下来将继续研究在JSSE框架下面向各种特定应用的个性化SSL实现。
参考文献:
[1]Netscape Communication Corporation.SSL 3.0 Specification[EB/OL].Available at :http://wp.netscape.com/eng/ssl3/.
[2]肖文凯,孙丽君,阮永良.基于JSSE的JDBC安全连接的研究与实现[J].计算机应用研究,2004,(2):111-114.
[3]Sun Microsystems.Java Secure Socket Extension (JSSE) Reference Guide[EB/OL].Available at:http://java.sun.com/j2se/1.5.0/docs/guide/ security/ jsse/JSSERefGuide.html.
[4]曾毅,袁时金,胡运发.电子政务安全支撑平台中的证书管理[J].计算机工程,2004,30(5):72-74.
[5]杨明,孟凡荣.整合SSL协议的Java RMI的研究与设计[J].计算机工程与设计,2007,28(15):3601-3604.
[6]陈垦,沈岳.JSSE在电子商务中的应用[J].湖南农业大学学报(自然科学版),2005,31(5):553-556.
[7]Cay S Horstmann,Gary Cornell.陈昊鹏,王浩,姚建平,等,译.JAVA 2核心技术 卷II:高级特性[M].北京:机械出版社,2006.599-677.
关键词:安全套接字层;Java安全套接字扩展;工厂模式
中图分类号:TP393文献标识码:A文章编号:1009-3044(2008)08-10ppp-0c
1 SSL
随着计算机网络的日益普及,如何保证数据在网络上安全传输已成为一项基础性技术。安全套接字层(Secure Sockets Layer, SSL)[1]由Netscape公司开发,是目前最具代表性,应用最为广泛的网络安全传输协议。它位于TCP/IP协议层与各种应用层协议之间,如图1所示:
因此,SSL可以广泛地应用在各种形式的网络传输中。例如使用浏览器访问安全站点所用的HTTPS协议就是SSL对HTTP协议的封装。SSL分为两层协议,底层是SSL记录协议,提供基本的安全服务;高层是握手协议、修改密文协议和告警协议,用于处理应用程序凭证的交换和验证[2]。SSL基于数字证书技术建立安全传输信道,其过程大致如下:(1)客户端与服务器交换SSL版本号等初始信息;(2)客户端与服务器相互验证对方证书(客户端验证为可选);(3)利用对方证书共同产生会话密钥;(4)利用会话密钥对后续的数据进行加、解密。
2 JSSE
JSSE(Java Secure Socket Extension,Java安全套接字扩展)是SUN公司所开发的对SSL的参考实现。从J2SE v1.4版本开始,JSSE成为JDK的标准组件,并纳入了J2EE规范[3]。在JSSE中包含了数据加密,服务器验证,消息完整性和客户端验证等技术,可以在客户机和服务器之间建立起一条SSL安全数据传输链路。为了方便应用程序开发者的使用,JSSE提供了一个可扩充的框架和一组Java API,主要包括:
(1)SSLSocketFactory和SSLServerSocketFactory:分别用来产生客户端和服务端的SSL套接字的工厂类。
(2)SSLSocket和SSLServerSocket:分别是客户端和服务端的SSL套接字,它们是java.net.Socket的子类。一个Socket代表TCP双向通信连接的一个端点,SSLSocket和SSLServerSocket总是成对出现。
(3)SSLSession:代表客户端与服务端的一次会话。它保存了会话期间的会话密钥,并提供相应的加、解密组件。
(4)HandShakeCompletedListener:网络监听器,负责监听客户端与服务端之间的“握手”事件(HandShakeCompletedEvent对象)。
(5)X509Certificate:客户端与服务端默认采用公钥体系的数字证书,即:X.509数字证书。X509Certificate对象提供了对X.509数字证书的访问机制。
(6)KeyManager和KeyManagerFactory:创建、存储和管理证书的工厂类及证书管理器对象。在建立SSL安全连接时,客户端和服务端需分别产生自身的证书并发送到对方验证。
(7)TrustManager和TrustManagerFactory:管理、验证通信对方的数字证书的工厂类及证书管理器对象,只有通过验证方可建立SSL安全连接。
可以看出,在JSSE中广泛采用了“工厂模式”(Factory Method),从而使得JSSE框架具备了良好的扩展性。其他软件开发者或应用提供商可以在JSSE规范下自行开发面向特定应用的具体实现。在JDK发布包中,SUN公司提供了自己开发的默认实现:SunJSSE。
3 建立安全连接
基于JSSE在客户机与服务器之间建立SSL安全连接可以分为四步:①为客户机与服务器分别建立X.509数字证书,并相互信任;②建立服务端的SSLServerSocket,并启动;③建立客户端的SSLSocket,并启动;④数据通信。
3.1 创建数字证书
在Java中可采用KeyStore(密钥仓库)技术来创建和存储X.509数字证书。KeyStore中可以存储两类不同的项,密钥项(Key Entry)存储极为敏感的加密密钥信息,由JSSE中的密钥管理器类(KeyManager)管理;可信任证书项(Trusted Certificate Entry)存储另一个对象的公钥证书,由JSSE中的可信任证书管理器类(TrustManager)管理[4]。
在Java中创建、存储、管理数字证书的方法有两种。一是通过keytool工具手工操作,实现简单,但操作繁琐,并且无法动态控制证书信息;二是通过JSSE的API,采用程序自动生成并动态管理。在本文所设计的安全连接原型中采用第二种方式,其关键过程如下:
// 创建工厂对象.
String alg=KeyManagerFactory.getDefaultAlgorithm();
KeyManagerFactory kmf=KeyManagerFactory.getInstance(alg);
// 动态创建KeyStore文件
FileInputStream fis=new FileInputStream(keyStore);
KeyStore ks=KeyStore.getInstance("jks");
ks.load(new FileInputStream(keyStore), keyPwd.toCharArray());
// 使用KeyStore初始化工厂对象
kmFact.init(ks, keyPwd.toCharArray());
// 创建证书对象数组
KeyManager[] kms=kmf.getKeyManagers();
实例中采用默认算法生成证书,也可根据需要选择其它的证书生成算法。可信任证书对象(TrustManager)的创建与此类似,不再赘述。
3.2 建立服务端与客户端Socket
当通信双方的证书创建后,可以用SSLSocketFactory和SSLServerSocketFactory分别创建客户端与服务端的Socket,验证对方证书并建立安全连接。
首先创建服务端Socket:
// 创建默认工厂对象
SSLServerSocketFactory ssf=
(SSLServerSocketFactory)SSLServerSocketFactory.getDefault();
// 创建套接字对象
SSLServerSocket serverSocket=(SSLServerSocket)ssf.createServerSocket(port);
// 指定双向验证(可选)
serverSocket.setNeedClientAuth(true);
// 监听连接请求
SSLSocket socket=(SSLSocket)serverSocket.accept();
// 创建网络监听器 对客户端证书授权验证.
HandshakeCompletedListener hcl=new MyHandshakeListener(ident);
socket.addHandshakeCompletedListener(hcl);
其中MyHandshakeListener是自定义的一个实现HandshakeCompletedListener的对象,负责实现SSL的握手协议,采用X.509证书对象(X509Certificate)验证通信对方的证书[5] [6] [7]。客户端Socket的建立与此类似,不再赘述。
3.3 数据通信
Socket建立后,客户端与服务端可通过流方式(Stream)传输数据,监听器在通信双方实时对数据进行加、解密,保证网络连路上数据的安全性。
4 结束语
由于TCP/IP网络的固有缺陷,通过网络传输数据存在很大的安全隐患。SSL协议基于数字证书为网络上通信双方建立了一条安全的传输信道。SUN公司提出的JSSE技术是SSL协议的具体实现,为软件开发者设计SSL应用提供了极大的便利。特别是JSSE基于工厂模式的架构,可方便地扩充各种个性化的SSL实现。
本文简要阐述了SSL的运行机理,具体研究了JSSE的框架和各种API,并应用JSSE设计了客户端与服务端之间SSL连接的原型,通过实例运行验证了原型的正确性。接下来将继续研究在JSSE框架下面向各种特定应用的个性化SSL实现。
参考文献:
[1]Netscape Communication Corporation.SSL 3.0 Specification[EB/OL].Available at :http://wp.netscape.com/eng/ssl3/.
[2]肖文凯,孙丽君,阮永良.基于JSSE的JDBC安全连接的研究与实现[J].计算机应用研究,2004,(2):111-114.
[3]Sun Microsystems.Java Secure Socket Extension (JSSE) Reference Guide[EB/OL].Available at:http://java.sun.com/j2se/1.5.0/docs/guide/ security/ jsse/JSSERefGuide.html.
[4]曾毅,袁时金,胡运发.电子政务安全支撑平台中的证书管理[J].计算机工程,2004,30(5):72-74.
[5]杨明,孟凡荣.整合SSL协议的Java RMI的研究与设计[J].计算机工程与设计,2007,28(15):3601-3604.
[6]陈垦,沈岳.JSSE在电子商务中的应用[J].湖南农业大学学报(自然科学版),2005,31(5):553-556.
[7]Cay S Horstmann,Gary Cornell.陈昊鹏,王浩,姚建平,等,译.JAVA 2核心技术 卷II:高级特性[M].北京:机械出版社,2006.599-677.