劉景林
(泉州經(jīng)貿(mào)職業(yè)技術(shù)學(xué)院 信息技術(shù)系,福建 泉州 362000)
基于JAAS安全機(jī)制的J2EE Web系統(tǒng)用戶身份認(rèn)證設(shè)計(jì)
劉景林
(泉州經(jīng)貿(mào)職業(yè)技術(shù)學(xué)院 信息技術(shù)系,福建 泉州 362000)
在J2EE Web系統(tǒng)中應(yīng)用JAAS技術(shù)提供的動(dòng)態(tài)、可插拔認(rèn)證模型實(shí)現(xiàn)用戶身份的安全認(rèn)證.通過(guò)X.509數(shù)字證書和用戶口令進(jìn)行雙重堆疊認(rèn)證,在Tomcat服務(wù)器上配置實(shí)現(xiàn)服務(wù)器與客戶端之間的SSL雙向認(rèn)證,并通過(guò)建立HTTPS連接以保護(hù)數(shù)據(jù)的安全傳輸,進(jìn)一步提高系統(tǒng)用戶認(rèn)證的安全性.
JAAS安全機(jī)制;J2EE應(yīng)用系統(tǒng);身份認(rèn)證;數(shù)字證書
隨著Java技術(shù)應(yīng)用的不斷普及,J2EE(Java 2 Platform Enterprise Edition)已日漸成為企業(yè)級(jí)軟件開(kāi)發(fā)的首選平臺(tái),基于J2EE架構(gòu)的Web系統(tǒng)廣泛應(yīng)用于電子政務(wù)、電子商務(wù)及網(wǎng)上銀行等安全性要求較高的領(lǐng)域,但由于互聯(lián)網(wǎng)中存在諸多不安全因素,如何在實(shí)現(xiàn)網(wǎng)上業(yè)務(wù)的同時(shí)提高系統(tǒng)用戶認(rèn)證和數(shù)據(jù)傳輸?shù)确矫娴陌踩?,已成為系統(tǒng)開(kāi)發(fā)人員關(guān)注的重點(diǎn).JAAS(Java Authentication and Authorization Service)技術(shù)作為Java2安全體系結(jié)構(gòu)的一個(gè)重要組成部分,其主要功能是實(shí)現(xiàn)用戶認(rèn)證與訪問(wèn)控制.JAAS側(cè)重于通過(guò)驗(yàn)證運(yùn)行代碼的用戶及其權(quán)限來(lái)保護(hù)系統(tǒng)免受攻擊,通過(guò)在應(yīng)用程序和底層的驗(yàn)證與授權(quán)機(jī)制之間加入一個(gè)抽象層,該抽象層可以簡(jiǎn)化涉及到 Java.Security包的程序開(kāi)發(fā),由于抽象層具有獨(dú)立于平臺(tái)的特性,使得各種不同的安全機(jī)制和應(yīng)用程序級(jí)代碼隔離,從而支持多種不同的安全認(rèn)證方式[1-4].JAAS認(rèn)證建立在可插入的認(rèn)證模塊(Pluggable Authentication Module,PAM)的安全體系結(jié)構(gòu)之上[5],這可使J2EE應(yīng)用系統(tǒng)獨(dú)立于底層的認(rèn)證技術(shù),方便其靈活地選擇、修改所使用的認(rèn)證技術(shù),也可以實(shí)現(xiàn)多種認(rèn)證機(jī)制的堆疊認(rèn)證,本文基于 JAAS安全機(jī)制在J2EE Web系統(tǒng)實(shí)現(xiàn)了用戶身份的安全認(rèn)證.
在使用JAAS安全機(jī)制實(shí)現(xiàn)用戶身份認(rèn)證過(guò)程中,需要?jiǎng)?chuàng)建一個(gè)登錄配置文件以指明系統(tǒng)登錄時(shí)所使用的認(rèn)證模塊,該登錄配置文件可以由一個(gè)或多個(gè)項(xiàng)組成,每個(gè)項(xiàng)為某個(gè)特定的應(yīng)用指定底層所使用的認(rèn)證模塊.在本例系統(tǒng)中,首先實(shí)例化一個(gè)登錄上下文LoginContext對(duì)象lc,并傳入2個(gè)參數(shù):第1個(gè)參數(shù)為“JAASExample”,即為登錄配置文件jaas.conf中的一個(gè)項(xiàng)的名字,LoginContext將自動(dòng)讀取并加載登錄配置文件中該項(xiàng)名稱對(duì)應(yīng)指定的登錄模塊;創(chuàng)建一個(gè)UsrPwdServletCallbackHandler實(shí)例對(duì)象作為L(zhǎng)oginContext初始化時(shí)的第2個(gè)參數(shù),該類用于獲取認(rèn)證用戶的用戶名和密碼.LoginContext初始化一個(gè)新的、空的javax.security.auth.Subject對(duì)象,通過(guò)使用該 Subject對(duì)象和 UsrPwdServletCallbackHandler對(duì)象初始化 UserModule認(rèn)證模塊.此時(shí)LoginContext將此UsrPwdServletCallbackHandler實(shí)例對(duì)象轉(zhuǎn)交給參數(shù)“JAASExample”指定的底層認(rèn)證模塊UserModule.當(dāng)認(rèn)證模塊需要與用戶交互獲取用戶名和密碼時(shí),登錄認(rèn)證模塊不直接與用戶打交道,而是通過(guò)調(diào)用 UsrPwdServletCallbackHandler對(duì)象來(lái)執(zhí)行與用戶的交互.一旦構(gòu)建好LoginContext對(duì)象之后,就可以利用該對(duì)象的login方法執(zhí)行認(rèn)證過(guò)程,LoginContext的login方法通過(guò)調(diào)用底層認(rèn)證模塊的login方法執(zhí)行具體的登錄認(rèn)證.
自定義的用戶交互類UsrPwdServletCallbackHandler實(shí)現(xiàn)了CallbackHandler接口,該類用于獲取認(rèn)證信息(如用戶名和密碼),LoginContext將該 CallbackHandler實(shí)例對(duì)象傳遞給底層的UserModule登錄認(rèn)證模塊.在 UsrPwdServletCallbackHandler()構(gòu)造方法中傳入獲取的用戶名和密碼,首先將用戶名和密碼保存在對(duì)象的屬性中,然后提取注冊(cè)到其中的所有Callback實(shí)例,將用戶名和密碼傳遞給相應(yīng)的Callback實(shí)例,該用戶交互類主要實(shí)現(xiàn)如下:
以上的handle方法通過(guò)遍歷Callback數(shù)組中的各個(gè)元素,提取注冊(cè)到CallbackHandler中的所有Callback實(shí)例,將用戶名和密碼傳遞給相應(yīng)的NameCallback實(shí)例和PasswordCallback實(shí)例.
當(dāng)系統(tǒng)在執(zhí)行LoginContext對(duì)象的login()方法登錄時(shí),將依次自動(dòng)調(diào)用登錄配置文件中設(shè)置的各個(gè)指定登錄模塊的login()方法來(lái)實(shí)現(xiàn)登錄驗(yàn)證.本例中分別使用基于用戶口令的登錄認(rèn)證模塊UserModule和基于用戶證書的認(rèn)證模塊CertModule共同實(shí)現(xiàn)用戶的身份認(rèn)證,只有全部通過(guò)兩種認(rèn)證模塊的驗(yàn)證才能實(shí)現(xiàn)成功登錄.
1.3.1 自定義用戶信息登錄模塊UserModule
用戶個(gè)人信息登錄模塊UserModule通過(guò)獲取用戶名和密碼實(shí)現(xiàn)認(rèn)證.該認(rèn)證模塊給回調(diào)處理器的handle()方法傳遞一個(gè)適當(dāng)?shù)腃allback類型的callbacks字節(jié)數(shù)組,callbacks含有用于獲取用戶名的NameCallback類型對(duì)象和用于獲取密碼的PasswordCallback類型對(duì)象,然后CallbackHandler執(zhí)行所請(qǐng)求的用戶交互,并將適當(dāng)?shù)闹荡嫒隿allbacks數(shù)組,登錄認(rèn)證模塊通過(guò)從callbacks數(shù)組中獲取用戶名與密碼.最后由自定義的UserProxy類訪問(wèn)MySQL數(shù)據(jù)庫(kù)中的用戶信息表,通過(guò)調(diào)用validateUser()方法以驗(yàn)證輸入的用戶登錄信息是否與數(shù)據(jù)庫(kù)用戶表中某一用戶信息相匹配.
1.3.2 自定義證書認(rèn)證模塊CertModule
證書認(rèn)證模塊CertModule主要實(shí)現(xiàn)客戶證書的驗(yàn)證.首先在Tomcat服務(wù)器中配置HTTPS安全協(xié)議和雙向SSL認(rèn)證,當(dāng)用戶通過(guò)HTTPS方式訪問(wèn)Web站點(diǎn)時(shí),則要求出示客戶證書.人同一CA頒發(fā)的所有證書都有一個(gè)唯一的、不重復(fù)的證書序列號(hào),因此可利用證書序列號(hào)作為用戶身份的標(biāo)志.服務(wù)器獲取客戶證書并將客戶數(shù)字證書存到當(dāng)前會(huì)話的“javax.servlet.request.X509 Certificate”屬性中,在CertModule登錄模塊的login()方法中將得到的客戶證書的序列號(hào)與MySQL數(shù)據(jù)庫(kù)中保存的證書序列號(hào)字段進(jìn)行比較,以認(rèn)證用戶身份.在讀取客戶端數(shù)字證書時(shí),可以使用request.getAttribute()方法獲得X509Certificate數(shù)組,再讀取X509Certificate對(duì)象中的序列號(hào).
本系統(tǒng)的軟件開(kāi)發(fā)測(cè)試平臺(tái)是基于JDK1.5,J2EE Web服務(wù)器使用Apache Tomcat5.5,用戶個(gè)人身份信息存放于MySQL5.0開(kāi)源數(shù)據(jù)庫(kù).
1)構(gòu)建并布署J2EE Web應(yīng)用
創(chuàng)建名稱為myApp的J2EE Web應(yīng)用,其文檔結(jié)構(gòu)和系統(tǒng)登錄頁(yè)面如圖1所示.
圖1中的login.jsp為系統(tǒng)測(cè)試用的登錄頁(yè)面,loginprocess.jsp為登錄處理頁(yè)面,實(shí)現(xiàn)成功登錄時(shí)轉(zhuǎn)入訪問(wèn)系統(tǒng)資源,否則提示出錯(cuò),要求重新進(jìn)行登錄.在auth文件夾中存放自定義的登錄認(rèn)證模塊UserModule和CertModule以及自定義的回調(diào)處理器類UsrPwdServletCallbackHandler.java;在WEB-INF文件夾的classes存放auth文件夾中所有java源程序相應(yīng)的.class文件以及第三方的jar包.最后將整個(gè)系統(tǒng)打包生成myApp.war文件,將該文件復(fù)制到Tomcat的安裝目錄下的webapps文件夾進(jìn)行布署.
圖1 J2EE Web應(yīng)用文檔結(jié)構(gòu)與登錄頁(yè)面
2)利用OpenSSL工具構(gòu)建數(shù)字證書
使用OpenSSL構(gòu)建自簽名根證書,并使用該根證書分別簽發(fā)服務(wù)器證書和客戶證書,由于CA根證書為自簽發(fā)的,未經(jīng)權(quán)威CA認(rèn)證,因此應(yīng)將根證書分別導(dǎo)入到服務(wù)器與客戶機(jī)瀏覽器中的“受信任的根證書頒發(fā)機(jī)構(gòu)”中;在服務(wù)器端分別將根證書和服務(wù)器證書復(fù)制到Tomcat安裝目錄下的conf文件夾;在客戶機(jī)瀏覽器中導(dǎo)入客戶證書,以便服務(wù)器與客戶端相互認(rèn)證對(duì)方的證書.另外,要實(shí)現(xiàn)客戶機(jī)的證書認(rèn)證,還必須將所頒發(fā)的客戶證書的序列號(hào)及用戶個(gè)人信息存放在MySQL數(shù)據(jù)庫(kù)中的用戶信息表.
3)配置Tomcat服務(wù)器
首先在Apache tomcat 5.5中的“configure Tomcat”項(xiàng)中指定JAAS登錄配置文件jaas.conf的位置(如圖2),以便告知Java虛擬機(jī)JAAS配置文件的所在位置,也可通過(guò)修改%JAVA_HOME%jrelib security文件夾下的 java.security文件,在其中添加一行代碼“java.security.auth.login.config= d:myAppWEB-INFjaas.conf”來(lái)實(shí)現(xiàn),其中“d:myApp”為J2EE應(yīng)用系統(tǒng)所在的文件夾,最后啟動(dòng)Tomcat服務(wù)器.
接下來(lái)在Tomcat服務(wù)器中配置HTTPS安全協(xié)議及雙向 SSL認(rèn)證,編輯 Tomcat安裝目錄下的confserver.xml文件如下:
圖2 Tomcat中配置JAAS登錄配置文件
其中clientAuth設(shè)置為“true”,意味著服務(wù)器與客戶機(jī)之間實(shí)現(xiàn)相互提交證書進(jìn)行認(rèn)證[5].
4)客戶機(jī)通過(guò)HTTPS方式訪問(wèn)服務(wù)器
當(dāng)客戶通過(guò)瀏覽器以HTTPS方式訪問(wèn)系統(tǒng)服務(wù)器時(shí),要進(jìn)行客戶證書的確認(rèn).在系統(tǒng)登錄過(guò)程中出現(xiàn)要求提交客戶證書的對(duì)話框時(shí),用戶可以選擇所使用的客戶端數(shù)字證書,服務(wù)器獲取客戶證書并提取其證書序列號(hào)進(jìn)行驗(yàn)證,當(dāng)用戶名與口令以及客戶數(shù)字證書的驗(yàn)證都通過(guò)之后才能成功登錄系統(tǒng)進(jìn)行訪問(wèn).
在J2EE Web系統(tǒng)用戶登錄驗(yàn)證過(guò)程中,利用JAAS提供的動(dòng)態(tài)、可插拔認(rèn)證模型實(shí)現(xiàn)基于用戶口令與X509數(shù)字證書的雙重堆疊認(rèn)證,使用服務(wù)器證書與客戶證書實(shí)現(xiàn)雙方相互間的 SSL雙向認(rèn)證,并通過(guò)HTTPS連接實(shí)現(xiàn)數(shù)據(jù)的安全傳輸.實(shí)踐證明,該認(rèn)證方案相對(duì)于基于用戶口令或數(shù)字證書等其他單方面認(rèn)證,既可以實(shí)現(xiàn)服務(wù)器對(duì)客戶端的雙重認(rèn)證,有效防止非授權(quán)用戶的非法訪問(wèn),較好地解決系統(tǒng)用戶的安全認(rèn)證問(wèn)題,又可以實(shí)現(xiàn)客戶端對(duì)服務(wù)器的認(rèn)證,防止登錄到假冒的服務(wù)器,同時(shí)能保證認(rèn)證雙方所傳輸數(shù)據(jù)的安全,進(jìn)一步增強(qiáng)了Web系統(tǒng)的安全性.
[1]彭超,馬丁.新一代JSP網(wǎng)絡(luò)編程入門與實(shí)踐[M].北京:清華大學(xué)出版社,2007:310.
[2]馬臣云,王彥.精通PKI網(wǎng)絡(luò)安全認(rèn)證技術(shù)與編程實(shí)現(xiàn)[M].北京:人民郵電出版社,2008:398-400.
[3]梁棟.Java加密與解密的藝術(shù)[M].北京:機(jī)械工業(yè)出版社,2010:341-350.
[4]羅銳,程文青.Java安全體系在Web程序中的研究和應(yīng)用[J].計(jì)算機(jī)應(yīng)用與研究,2006(7):113-114.
[5]朱福喜,傅建明,唐曉軍.JAVA項(xiàng)目設(shè)計(jì)與開(kāi)發(fā)范例[M].北京:電子工業(yè)出版社,2005:253.
The Design of User Identity Authentication in J2EE Web System Based on JAAS Security Mechanism
LIU Jing-lin
(Department of Information Technology,Quanzhou Vocational and Technical College of Economy and Trade,Quanzhou 362000,China)
In the J2EE Web application system,JAAS technology is used to provide a dynamic, pluggable authentication model to achieve the authentication of user security,i.e.,through the double stack authentication of X.509 digital certification and user authentication password.The SSL mutual authentication is set up in the Tomcat to achieve authentication between the server and client and HTTPS connections are established to protect the security of data transmission and further improve the security of user authentication.
JAAS security;J2EE applications;authentication;digital certification
?
TP309
A
1006-7302(2011)03-0074-05
2011-03-24
劉景林(1971—),男,福建省泉州人,講師,碩士,研究方向?yàn)镴2EE應(yīng)用開(kāi)發(fā)、網(wǎng)絡(luò)安全.