摘要:該文主要探討了Web Services的安全性問題以及解決方案。簡要介紹了Web Services安全技術(shù),提出了實現(xiàn)Web Services安全性的具體實現(xiàn)方案:包括利用用戶名/密碼來設(shè)定訪問權(quán)限;對客戶端IP地址進(jìn)行過濾;以及使用加密數(shù)據(jù)傳輸方式來實現(xiàn)Web Services的安全。
關(guān)鍵詞:Web Services;Tomcat;Servlet;SSL協(xié)議
中圖分類號:TP393文獻(xiàn)標(biāo)識碼:A文章編號:1009-3044(2008)35-2084-04
Web Services Security Solutions and Realize
DONG Yi-ge1, LIU Pei-xian2
(1.Electronic Engineering Department, Science and Technology Engineering School, Beijing Vocational College of Electronic Science, Beijing 100016, China; 2.College of Information Science and Technology, Beijing Chemical Industry University, Beijing 100013, China)
Abstract: This article on the Web Services security issues and solutions. Web Services gave a briefing on security technology, proposes a Web Services security of the concrete realization of the programme: including the use of ID / password to set up access; the client IP address filtering and use of encrypted data transmission means to achieve Web Services Security.
Key words: web services; tomcat; servlet; SSL protocol
1 Web Services安全性方案
Web Services是在開放的Internet上運行的,這種環(huán)境即使受到防火墻的保護(hù),也依然會受到黑客、計算機(jī)病毒的攻擊。而且在商業(yè)環(huán)境中,每個Web服務(wù)的狀態(tài)都可能涉及經(jīng)濟(jì)利益和商業(yè)機(jī)密,如網(wǎng)絡(luò)購物服務(wù)中有電子貨幣信息;信息查詢服務(wù)中有商業(yè)機(jī)密(如價格、貨物種類等)。[1]在Web Services運行過程中,對其狀態(tài)的非法讀取和惡意修改都將對安全性構(gòu)成嚴(yán)重的威脅。安全性的制約被公認(rèn)為是阻礙Web Services模型被廣泛使用的一個重要因素。[2]
安全的Web服務(wù)是Web服務(wù)成功的必要保證。眾所周知,Web服務(wù)是使用XML進(jìn)行數(shù)據(jù)交換的,而XML在默認(rèn)情況下是明文編碼的;同時,大部分Web服務(wù)使用HTTP協(xié)議作為傳輸協(xié)議,同樣,HTTP也是使用明文方式來傳輸數(shù)據(jù)的。這就造成了在不加密的傳輸協(xié)議上傳輸不加密的信息,從而使信息傳輸?shù)谋C苄允艿酵{。
根據(jù)應(yīng)用對安全要求的級別不同,可以采用不同的方式來實現(xiàn)安全性,本文采用了以下幾種方式來實現(xiàn)Web Services的安全性:
1) 利用用戶名/密碼來設(shè)定訪問權(quán)限:J2EE Web應(yīng)用默認(rèn)的訪問控制;
2) 對客戶端IP地址進(jìn)行過濾:使用Servlet過濾器(Filter)進(jìn)行訪問控制;
3) 使用加密數(shù)據(jù)傳輸方式來實現(xiàn)Web Services的安全:使用SSL/HTTPS協(xié)議來傳輸。
使用訪問認(rèn)證機(jī)制來進(jìn)行權(quán)限驗證(包括利用用戶名/密碼來設(shè)定訪問權(quán)限和對客戶端IP地址進(jìn)行過濾)對于安全級別要求不高的應(yīng)用是可行的,它能夠使用Web應(yīng)用訪問認(rèn)證機(jī)制來進(jìn)行權(quán)限驗證,從而保護(hù)對資源的訪問。但需要注意的是,雖然它們進(jìn)行了身份驗證,但信息的傳遞還是以明文的方式進(jìn)行的,不能保證信息在傳輸過程中不被竊取。而SSL是一個安全的傳輸協(xié)議,使用它傳輸Web服務(wù)能保證信息不被第三方竊取。
2Web Services安全方案的實現(xiàn)
2.1 利用用戶名/密碼來設(shè)定訪問權(quán)限
在實現(xiàn)訪問Web Services安全性問題上,我們首先想到的是使用身份驗證來確認(rèn)訪問者的合法性。利用用戶名/密碼來設(shè)定訪問權(quán)限:J2EE Web應(yīng)用默認(rèn)的訪問控制。
不管客戶端通過什么API來調(diào)用Web服務(wù),它總是先構(gòu)造SOAP消息,然后通過HTTP POST方法把消息發(fā)送到Web服務(wù)的URL。而我們知道,不管Axis部署在哪種服務(wù)器上(Tomcat還是Websphere),它總是以Servlet方式來運行的。所以最簡單實現(xiàn)Web服務(wù)安全的方式就是通過在Web應(yīng)用的配置文件(web.xml)來實現(xiàn)訪問控制。
本文部署的Web Services是以Tomcat作為服務(wù)器的,以下闡述如何使用Web應(yīng)用模型中基本認(rèn)證方法來配置Web服務(wù)的安全訪問。
Web應(yīng)用的基本認(rèn)證是建立在J2EE角色和用戶的基礎(chǔ)之上,首先在Tomcat角色配置文件中增加一個角色和一個帳號。
在tomcat-users.xml中增加角色(Tomcat_Home\\conf\omcat-users.xml)
<?xml version='1.0' encoding='utf-8'?>
<tomcat-users>
…
<role rolename=\"department-manager\"/>
<user username=\"dong \" password=\"6666 \" roles=\"department-manager\"/>
…
</tomcat-users>
上面配置代碼在Tomcat配置文件中添加了一個department-manager角色,并且在此角色中添加了一個名為dong的用戶。要使tomcat-users.xml中配置的角色和用戶生效,需要配置Tomcat使用UserDatabaseRealm。打開Tomcat_Home\\conf\\server.xml配置文件,在GlobalNamingResources中添加以下描述:
<GlobalNamingResources>
……
<Resource name=\"UserDatabase\" auth=\"Container\"
type=\"org.apache.catalina.UserDatabase\"
description=\"User database that can be updated and saved\">
</Resource>
<ResourceParams name=\"UserDatabase\">
<parameter>
<name>factory</name>
<value>org.apache.catalina.users.MemoryUserDatabaseFactory</value>
</parameter>
<parameter>
<name>pathname</name>
<value>conf/tomcat-users.xml</value>
</parameter>
</ResourceParams>
</GlobalNamingResources>
然后再web應(yīng)用的部署描述符中指定Web服務(wù)資源的訪問控制,如下所示:
配置對Servlet的訪問控制(AXIS_HOME\\WEB-INF\\web.xml)
<security-constraint>
<web-resource-collection>
<web-resource-name>Tax Web service </web-resource-name>
<url-pattern>/periodic </url-pattern>
</web-resource-collection>
<auth-constraint>
<role-name>department-manager</role-name>
</auth-constraint>
</security-constraint>
<login-config>
<auth-method>BASIC</auth-method>
<realm-name>Axis Basic Authentication Area</realm-name>
</login-config>
<security-role>
<role-name>department-manager</role-name>
</security-role>
url-pattern指定了需要通過角色驗證的URL樣式,在這里是\"/periodic\";role-name是能夠訪問制定URL的角色,這里是department-manager。以上配置實現(xiàn)只有角色類型是\"department-manager\"的用戶才能訪問URL樣式為\"/periodic\"的Web服務(wù)。
這樣用戶權(quán)限就設(shè)置完成了,在客戶端調(diào)用服務(wù)時就必須添加用戶名/密碼來實現(xiàn)用戶的身份認(rèn)證。核心代碼如下:
String endpoint =\"http://222.199.225.248:8080/axis/periodic.jws\";//WSDL文件
……
call.getMessageContext().setUsername(\"dong\");//axis中的用戶名。
call.getMessageContext().setPassword(\"6666\");//密碼
……
可以看出,通過使用call.getMessageContext().setUsername(\"peixian\")來設(shè)置調(diào)用的用戶名,通過setPassword來設(shè)置調(diào)用的密碼。通過上面的代碼可以看出,除了為Call對象設(shè)置的用戶名和密碼外,其它的代碼和不使用訪問控制時一樣。如果用戶名、密碼不正確就不能調(diào)用服務(wù)了。
2.2 對客戶端IP地址進(jìn)行過濾
使用Servlet過濾器(Filter)進(jìn)行訪問控制Axis的Web服務(wù)端本質(zhì)上是以Servlet方式在運行,所有我們完全可以在Web應(yīng)用上部署一個Servlet過濾器,通過此過濾器來達(dá)到訪問控制的效果。
Web應(yīng)用中的過濾器截取從客戶端進(jìn)來的請求,然后進(jìn)行一系列處理,最后把請求發(fā)送到目標(biāo)Servlet。過濾器可以說是外部進(jìn)入Web服務(wù)器的第一道關(guān)口,它能決定請求是否繼續(xù)向前轉(zhuǎn)發(fā),也能對請求中的信息進(jìn)行處理。如果過濾器用于對Web服務(wù)進(jìn)行訪問控制,那么它能根據(jù)客戶端信息決定目標(biāo)的服務(wù)是否能調(diào)用成功。
本文在這里開發(fā)的過濾器是根據(jù)客戶端IP地址進(jìn)行過濾,如果客戶端的IP地址在限制范圍中,那么就不能訪問目標(biāo)的Web服務(wù)。過濾器部分代碼如下:
package com.hellking.study.webservice;
import javax.servlet.FilterChain;
……
public class WebServicesFilter implements Filter
{
//沒有權(quán)限訪問的IP地址
static final String[] deniedIPList=new String[]{\"202.4.130.128\"};
public boolean isIPDenied(String ipAddr)
{
……
}
//過濾處理的方法
public void doFilter(final ServletRequest req, final ServletResponse res, FilterChain chain) throws IOException,ServletException
{
HttpServletRequest hreq = (HttpServletRequest)req;
HttpServletResponse hres = (HttpServletResponse)res;
//HttpSession session = hreq.getSession();
String clientIp=req.getRemoteAddr();
System.out.println(\"開始過濾……\");
if(isIPDenied(clientIp))
{
//驗證不成功,不讓用戶登錄。
throw new ServletException(\"無權(quán)限訪問此Web服務(wù)!\");
}
else
{
//驗證成功,繼續(xù)處理
chain.doFilter(req,res);
}}
……
}
WebServicesFilter 過濾器限制了deniedIPList中指定的所有客戶端。編寫了過濾器后,需要在Web應(yīng)用的部署描述符中指定使用此過濾器,并且把過濾器映射到目標(biāo)URL上。也就是說除了編寫Servlet過濾器實現(xiàn)類外,還需要在web.xml中對它進(jìn)行配置,并且把過濾器映射到要過濾的目標(biāo)URL上。以下是過濾器的部署描述符:
<filter>
<filter-name>W(wǎng)ebServicesFilter</filter-name>
<filter-class>com.hellking.study.webservice.WebServicesFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>W(wǎng)ebServicesFilter</filter-name>
<url-pattern>/ *</url-pattern>
</filter-mapping>
url-pattern指定了過濾器要過濾的范圍。\"/*\"正是AxisServlet默認(rèn)的URL。通過上面的配置,只要客戶端調(diào)用Axis Web服務(wù),就會被WebServicesFilter過濾器過濾。如果客戶端IP地址在過濾器的deniedIPList中,那么就不能訪問目標(biāo)服務(wù)。
2.3 使用SSL作為Web服務(wù)的傳輸協(xié)議
目前大多數(shù)Web Services的實現(xiàn)都是以HTTP作為其傳輸層,因此常常結(jié)合HTTP原有的安全機(jī)制。目前,最流行最廣泛使用的安全措施就是使用安全套接字層--SSL。
SSL(Secure Sockets Layer)是由Netscape公司開發(fā)的一套Internet數(shù)據(jù)安全協(xié)議,目前版本是3.0,它已被廣泛地用于Web瀏覽器與服務(wù)器之間的身份認(rèn)證和加密數(shù)據(jù)傳輸。SSL協(xié)議使用不對稱加密技術(shù)實現(xiàn)會話雙方之間信息的安全傳遞。可以實現(xiàn)信息傳遞的保密性、完整性,并且會話雙方能鑒別對方身份。總的來說,SSL 是創(chuàng)建安全通信的一種非常有效的方法。Microsoft XML Web Service 既支持客戶端中的集成 SSL,也支持服務(wù)器中的集成 SSL[3]。以下是實現(xiàn)過程的具體描述:
1) 下載并安裝JSSE
JSSE(Java Security Socket Extension)--Java安全套接字?jǐn)U展,是Sun為了解決在Internet上的安全通訊而推出的解決方案。他提供了一套框架和Java版本的SSL(Secure Sockets Layer)和TLS(Transport Layer Security)協(xié)議的實現(xiàn),也包括了廣泛的功能,如:數(shù)據(jù)加密、服務(wù)器證明、消息完整性,以及可選的客戶證明。使用JSSE,開發(fā)者能夠提供一個基于任何協(xié)議之上(如:Hypertext Transfer Protocol(HTTP),Telnet,or FTP,over TCP/IP)的客戶和服務(wù)器的安全數(shù)據(jù)通道。JSSE是基于安全算法和握手機(jī)制之上的合成體。JSSE能將危險的安全弱點降到最低點,并且減輕了開發(fā)者的負(fù)擔(dān),使得開發(fā)者可以很輕松的整合到程序中。
本實驗使用的是JSSE1.5.0版本,這里用它來產(chǎn)生Tomcat使用的秘鑰對(keystore)。下載后將lib里面的jcert.jar、jnet.jar、jsse.jar 解壓縮到%JAVA_HOME%\\jre\\lib\\ext目錄下完成JSSE的安裝。
2) 修改Tomcat配置文件中的web.xml
Tomcat的conf目錄包含不同的配置文件,在主要配置文件server.xml中默認(rèn)的HTTP連接端口是8080,需要修改為HTTPS的連接端口8443。修改內(nèi)容如下:
將端口為8080的HTTP連接端口注釋掉,加上下面這段代碼:
<!-- Define a SSL Coyote HTTP/1.1 Connector on port 8443 -->
<Connector port=\"8443\"
maxThreads=\"150\" minSpareThreads=\"25\" maxSpareThreads=\"75\"
enableLookups=\"1\" disableUploadTimeout=\"true\"
acceptCount=\"100\" debug=\"0\" scheme=\"https\" secure=\"true\"
clientAuth=\"1\" sslProtocol=\"TLS\" keystoreFile=\"C:\\.keystore\"/>
3) 證書生成
SSL協(xié)議可以分成兩部分:握手和數(shù)據(jù)傳輸。握手建立一個包含發(fā)送方和接收方公鑰密碼值的安全上下文。然后數(shù)據(jù)傳輸使用源自這個安全上下文的共享密鑰[4]。
使用keytool可以幫助用戶創(chuàng)建這些文件(該工具在Java的bin目錄下):
① 在服務(wù)器端生成密鑰對(KeyPair):
%JAVA_HOME%\\bin\\keytool -genkey -alias tomcat -keyalg RSA
② 導(dǎo)出證書:
keytool -export -alias tomcat -file tomcat.cer
③ 導(dǎo)入信任證書tomcat.cer到cacerts這個證書庫:
keytool -import -trustcacerts -alias tomcat -file tomcat.cer -keystore cacerts
④ 查看客戶端cacerts證書項,確認(rèn)含有tomcat這一證書:
keytool -list -keystore cacerts
此時,便完成了對tomcat的SSL配置。為了檢驗配置是否正確,我們啟動tomcat的8443端口,訪問:https://localhost:8443/,出現(xiàn)窗口如圖1所示。
選擇“是”繼續(xù),直至出現(xiàn)Tomcat歡迎頁面。到此為止,SSL配置成功。
4) 部署并調(diào)用Web服務(wù)
該Web Services部署過程與在HTTP上部署過程相同。只是生成的接口文件內(nèi)容不同。因為接口文件是通過WSDL生成,而此時的WSDL已經(jīng)是在加了安全協(xié)議上的描述文件。執(zhí)行下面命令生成接口文件:
java -cp Djavax.net.ssl.trustStore=C:\\.keystore org.apache.axis.wsdl.WSDL2Java https://localhost:8443/axis/periodic.jws?wsdl
注:若出現(xiàn)錯誤提示找不到有效的證書,則用Djavax.net.ssl.trustStore=C:\\.keystore來指定證書所在的位置。
3 結(jié)論
隨著Web Service的應(yīng)用越來越廣。其安全性逐步成為人們最關(guān)心的問題。本文根據(jù)應(yīng)用程序的安全級別的不同,提供了三種安全措施,利用用戶名/密碼來設(shè)定訪問權(quán)限;對客戶端IP地址進(jìn)行過濾;使用SSL作為Web服務(wù)的傳輸協(xié)議。SSL 可提供安全的連接,它允許兩個通過網(wǎng)絡(luò)連接的應(yīng)用程序驗證對方的身份以及對應(yīng)用程序間交換的數(shù)據(jù)進(jìn)行加密,是目前應(yīng)用最為廣泛的一種。通過以上三種安全措施,可有效提高系統(tǒng)的安全性。
參考文獻(xiàn):
[1] 黃九梅,李文婷,趙英.Web Services 客戶端的實現(xiàn)與性能分析[J].中國科技信息,2006(9):148-149.
[2] Thelin J.Identity,security,and XML Web Services[C]//O' Reilly Emerging Technology Conference,2003.
[3] Birbeck M.XML高級編程[M].2版.裴劍鋒,高偉,譯.北京:機(jī)械工業(yè)出版社,2002.
[4] David C.XML-Schema part of primer[EB/OL].(2001-05-02).http://www.w3.org/TR/2001/REC-xmlschema.