摘要:從網絡數據傳輸的安全性問題出發,研究了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.