国产一级a片免费看高清,亚洲熟女中文字幕在线视频,黄三级高清在线播放,免费黄色视频在线看

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費(fèi)電子書(shū)等14項(xiàng)超值服

開(kāi)通VIP
實(shí)現(xiàn)安全的AXIS Web服務(wù),第1部分

axis是流行的Web服務(wù)開(kāi)發(fā)工具,如何在axis下開(kāi)發(fā)安全的Web服務(wù),這是擺在每個(gè)開(kāi)發(fā)者面前的問(wèn)題。本文是J2EE Web服務(wù)開(kāi)發(fā)系列文章的第十二篇,將首先簡(jiǎn)單介紹Web服務(wù)安全性基本概念,然后介紹在axis Web服務(wù)開(kāi)發(fā)工具下處理安全性問(wèn)題的一些常用方法;接下來(lái)以安全性實(shí)現(xiàn)方法為線索,介紹了怎么在Web應(yīng)用的基礎(chǔ)上配置Web服務(wù)的訪問(wèn)控制、怎么使用axis的Handler和Servlet的過(guò)濾器進(jìn)行訪問(wèn)控制,最后討論怎么在tomcat下配置SSL 以實(shí)現(xiàn)Web服務(wù)的安全傳輸。本文下一篇將介紹怎么在axis中實(shí)現(xiàn)WS-Security。

閱讀本文前您需要以下的知識(shí)和工具:

  • Apache axis1.1,并且會(huì)初步使用;
  • Tomcat 4.0以上, 并且會(huì)初步使用;
  • Servlet的開(kāi)發(fā)經(jīng)驗(yàn);
  • SOAP消息(SOAP Message)編程知識(shí);
  • JAX-RPC編程基礎(chǔ)知識(shí);
  • Java安全編程基礎(chǔ)知識(shí)。

本文的參考資料見(jiàn) 參考資料。

本文的全部代碼在這里 下載。

Web服務(wù)安全概述

安全的Web服務(wù)是Web服務(wù)成功的必要保證。但眾所周知的是,Web服務(wù)使用XML來(lái)進(jìn)行數(shù)據(jù)交換,而XML在默認(rèn)情況下是明文編碼的;同時(shí),大部分Web服務(wù)使用HTTP協(xié)議作為傳輸協(xié)議,同樣,HTTP也是使用明文方式來(lái)傳輸數(shù)據(jù)的。這就造成了在不加密的傳輸協(xié)議上傳輸不加密的信息,從而使信息傳輸?shù)谋C苄允艿酵{。作為企業(yè)級(jí)的應(yīng)用,以上的方式不能滿足安全性基本要求:

  1. 數(shù)據(jù)在因特網(wǎng)上傳播時(shí)不應(yīng)該被第三方看到;
  2. 雙方必須能夠確定消息的來(lái)源;
  3. 雙方必須能夠確定被傳送的數(shù)據(jù)沒(méi)有被篡改。

通過(guò)使用SSL協(xié)議可以解決第一個(gè)問(wèn)題:"不應(yīng)該被第三方看到";使用數(shù)字簽名和數(shù)字證書(shū)可以解決后面兩個(gè)問(wèn)題。當(dāng)使用數(shù)字證書(shū)方法時(shí),Web 服務(wù)請(qǐng)求者必須有一個(gè)由可信認(rèn)證中心簽署的數(shù)字證書(shū)。請(qǐng)求者使用這個(gè)證書(shū)來(lái)表明它們的身份,并對(duì) SOAP 消息進(jìn)行數(shù)字簽名。對(duì)方系統(tǒng)接收到消息后,就可對(duì)消息做時(shí)間戳記并進(jìn)行日志記錄。此時(shí),數(shù)字簽名會(huì)得到驗(yàn)證。驗(yàn)證過(guò)程將確保消息來(lái)自發(fā)送方,并且還要驗(yàn)證消息內(nèi)容在傳輸過(guò)程中沒(méi)有被篡改。

IBM、Microsoft 和 Verisign 于2002年十二月份聯(lián)合發(fā)布了一個(gè)關(guān)于 Web 服務(wù)安全性(Web Services Security,WS-Security)的規(guī)范,該規(guī)范描述如何向 SOAP 消息附加簽名和加密報(bào)頭;另外,它還描述如何向消息附加安全性令牌(包括二進(jìn)制安全性令牌,如 X.509 證書(shū)),提供了一套幫助 Web 服務(wù)開(kāi)發(fā)者保護(hù) SOAP 消息交換的機(jī)制。

根據(jù)應(yīng)用的對(duì)安全要求的級(jí)別不同,可以采用不同的方式來(lái)實(shí)現(xiàn)安全性,以下是目前最常用的一些實(shí)現(xiàn)方式(從低到高排列):

  • J2EE Web應(yīng)用默認(rèn)的訪問(wèn)控制(數(shù)據(jù)是明文的);
  • 使用axis的Handler進(jìn)行訪問(wèn)控制(數(shù)據(jù)是明文的);
  • 使用Servlet過(guò)濾器(Filter)進(jìn)行訪問(wèn)控制(數(shù)據(jù)是明文的);
  • 使用SSL/HTTPS協(xié)議來(lái)傳輸(加密的數(shù)據(jù)傳輸協(xié)議);
  • 使用WS-Security規(guī)范對(duì)信息進(jìn)行加密與身份認(rèn)證(數(shù)據(jù)被加密傳輸)。

前三種方式對(duì)于安全級(jí)別要求不高的應(yīng)用是可行的,它能夠使用Web應(yīng)用訪問(wèn)認(rèn)證機(jī)制來(lái)進(jìn)行權(quán)限驗(yàn)證,從而保護(hù)對(duì)資源的訪問(wèn)。但需要注意的是,雖然它們進(jìn)行了身份驗(yàn)證,但信息的傳遞還是以明文的方式進(jìn)行的,不能保證信息在傳輸過(guò)程中不被竊取。SSL是一個(gè)安全的傳輸協(xié)議,使用它傳輸Web服務(wù)能保證信息不被第三方竊取。但它有個(gè)缺點(diǎn)就是對(duì)系統(tǒng)資源消耗大。采用最后一種方式,信息被簽名后再加密,然后把加密后的信息網(wǎng)絡(luò)上傳播,這樣,即使第三方獲得加密后的傳輸信息,也不能解密。對(duì)于安全級(jí)別要求高的系統(tǒng),應(yīng)該采用WS-Security規(guī)范來(lái)作為Web服務(wù)安全性解決方案。



回頁(yè)首


開(kāi)發(fā)、部署示例Web服務(wù)

作為一個(gè)實(shí)例性的教程,我們有必要先開(kāi)發(fā)一個(gè)簡(jiǎn)單的Web服務(wù)作為示例。關(guān)于如何在Axis下開(kāi)發(fā)并部署一個(gè)簡(jiǎn)單的Web服務(wù)你可以參考下面這篇文章: 用JAX-RPC開(kāi)發(fā)Web服務(wù):Servlet作為Web服務(wù)端點(diǎn)。

下面的例子提供的是一個(gè)提供個(gè)人所得稅計(jì)算的Web服務(wù)。客戶端傳入工資的金額,Web服務(wù)將計(jì)算個(gè)人所得稅金額。


例程 1 個(gè)人所得稅Web服務(wù)

package com.hellking.study.webservice;
public class PersonalTaxService
{
	final double base=1200;//所得稅上繳基數(shù)。	
	public  double getTax(double salary)
    {
    	double tax_salary=salary-1200;    	
    	double tax=0.0d;//計(jì)算后的所得稅。    	
    	if(0>tax_salary)                             tax=0;
    	else if(0<tax_salary&&tax_salary <=500)      tax=tax_salary*0.05-0;
    	else if(500<tax_salary&&tax_salary<=2000)    tax=tax_salary*0.10-25;
     …    	   	
    	return tax;
    } 
}

編譯后,你只要在Axis的部署配置文件(AXIS_HOME\Web-INF\server-config.wsdd)的適當(dāng)位置增加以下部署代碼,Web服務(wù)就可以部署成功。


例程2 部署示例Web服務(wù)

    <service name="PersonalTaxService" provider="java:RPC">
  <parameter name="allowedMethods" value="*"/>
  <parameter name="className" value="com.hellking.study.webservice.PersonalTaxService"/>
  </service>
  

部署后的Web服務(wù)URL為: http://localhost:8080/axis/services/PersonalTaxService?wsdl (請(qǐng)先部署好這個(gè)Web服務(wù)再進(jìn)行下面的學(xué)習(xí)。)



回頁(yè)首


從Web應(yīng)用的基本認(rèn)證說(shuō)起

不管客戶端通過(guò)什么API來(lái)調(diào)用Web服務(wù),它總是先構(gòu)造SOAP消息,然后通過(guò)HTTP POST方法把消息發(fā)送到Web服務(wù)的URL(注1:當(dāng)然,Web服務(wù)也可以通過(guò)其它基于文本的協(xié)議傳輸,但是由于非常少見(jiàn),在這里不討論)。而我們知道,不管axis部署在哪種服務(wù)器上(Tomat還是Websphere),它總是以Servlet方式來(lái)運(yùn)行的。所以最簡(jiǎn)單實(shí)現(xiàn)Web服務(wù)安全的方式就是通過(guò)在web應(yīng)用的配置文件(web.xml)來(lái)實(shí)現(xiàn)訪問(wèn)控制。

J2EE web應(yīng)用中有多種認(rèn)證方式:BASIC(基本認(rèn)證方法)、FORM(基于表單)、DIGEST(消息摘要)和CLIENT-CERT(數(shù)字證書(shū))。關(guān)于J2EE Web應(yīng)用的其它認(rèn)證方式的配置請(qǐng)參考其它資料,在此不再介紹。

下面以Tomcat使用服務(wù)器為例,使用Web應(yīng)用模型中基本認(rèn)證方法來(lái)配置Web服務(wù)的安全訪問(wèn)。

Web應(yīng)用的基本認(rèn)證是建立在J2EE角色和用戶的基礎(chǔ)之上,首先在Tomcat角色配置文件中增加一個(gè)角色和一個(gè)賬號(hào)。


例程3 在tomcat-users.xml中增加角色(Tomcat_Home\conf\tomcat-users.xml)

<?xml version=‘1.0‘ encoding=‘utf-8‘?>
<tomcat-users>
…  
<role rolename="department-manager"/>
  <user username="hellking" password="simplewebservices" roles="department-manager"/> 
…
</tomcat-users>

上面配置代碼在tomcat配置文件中添加了一個(gè)department-manager角色,并且在此角色中添加了一個(gè)名為hellking的用戶。要使tomcat-users.xml中配置的角色和用戶生效,需要配置tomcat使用UserDatabaseRealm。打開(kāi)Tomcat_Home\conf\server.xml配置文件,在GlobalNamingResources中添加以下描述:


例程4 在tomcat中添加UserDatabaseRealm

  <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ù)資源的訪問(wèn)控制,如下所示:


例程5 配置對(duì)Servlet的訪問(wèn)控制(AXIS_HOME\WEB-INF\web.xml)

<security-constraint>
  <web-resource-collection>
    <web-resource-name>Tax Web service </web-resource-name>
    <url-pattern>/services/PersonalTaxService</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指定了需要通過(guò)角色驗(yàn)證的URL樣式,在這里是"/services/PersonalTaxService";role-name是能夠訪問(wèn)制定URL的角色,這里是department-manager。以上配置的意思是只有角色類(lèi)型是"department-manager"的用戶才能訪問(wèn)URL樣式為"/services/PersonalTaxService"Web服務(wù)。

下面我們看怎么在axis客戶端代碼中axis客戶端,如例程6所示。


例程6 axis客戶端代碼

package com.hellking.study.webservice;

import org.apache.axis.client.Call;
import org.apache.axis.client.Service;
。。。

/**
 *調(diào)用需要驗(yàn)證的Web服務(wù)
 */
public class AuthClient
{
	static	final double salary=5000;
    public static void main(String [] args)
    {
        try {
        	//服務(wù)端的url,需要根據(jù)情況更改。            
            String endpointURL = "http://localhost:8080/axis/services/PersonalTaxService?wsdl";//
// Web服務(wù)端點(diǎn)地址            
            Service  service = new Service();
            Call     call    = (Call) service.createCall();
            call.setTargetEndpointAddress( new java.net.URL(endpointURL) );
            call.setOperationName( new QName("PersonalTaxService", "getTax") );//設(shè)置操作的名稱(chēng)。
            //由于需要認(rèn)證,故需要設(shè)置調(diào)用的用戶名和密碼。
            call.getMessageContext().setUsername("hellking");//設(shè)置用戶名。
            call.getMessageContext().setPassword("simplewebservices");//設(shè)置密碼
            call.addParameter( "op1", XMLType.XSD_DOUBLE, ParameterMode.IN );//參數(shù)的類(lèi)型
		   call.setReturnType( XMLType.XSD_DOUBLE );//返回的數(shù)據(jù)類(lèi)型
            Double ret = (Double) call.invoke( new Object [] { new Double(salary) });//執(zhí)行調(diào)用
		  System.out.println("使用HTTP協(xié)議來(lái)作為Web服務(wù)的傳輸協(xié)議!");			
            System.out.println("已經(jīng)成功調(diào)用。請(qǐng)參看服務(wù)端的輸出!");
            System.out.println("輸入工資"+salary+"元,應(yīng)交個(gè)人所得稅:"+ret);
     。。。
    }
}

可以看出,通過(guò)使用call.getMessageContext().setUsername("hellking")來(lái)設(shè)置調(diào)用的用戶名,通過(guò)setPassword來(lái)設(shè)置調(diào)用的密碼。通過(guò)上面的代碼可以看出,除了為Call對(duì)象設(shè)置的用戶名和密碼外,其它的代碼和不使用訪問(wèn)控制時(shí)一樣。

下面我們看看它的運(yùn)行結(jié)果:


使用HTTP協(xié)議來(lái)作為Web服務(wù)的傳輸協(xié)議!
已經(jīng)成功調(diào)用。請(qǐng)參看服務(wù)端的輸出!
輸入工資5000.0元,應(yīng)交個(gè)人所得稅:445.0

從輸出可以看到,客戶端成功通過(guò)了驗(yàn)證,并且返回了正確的結(jié)果。



回頁(yè)首


使用axis的Handler進(jìn)行訪問(wèn)控制

axis為Web服務(wù)的訪問(wèn)控制提供了相關(guān)的配置描述符,并且提供了一個(gè)訪問(wèn)控制的簡(jiǎn)單Handler(關(guān)于Handler的詳細(xì)介紹見(jiàn)" J2EE Web服務(wù)開(kāi)發(fā)系列之六: 使用Handler來(lái)增強(qiáng)Web服務(wù)的功能")。默認(rèn)情況下,你只要在配置描述符中添加用戶,然后在Web服務(wù)器的部署描述符中自動(dòng)允許的角色即可。

首先在axis的配置文件users.lst(位于WEB-INF目錄下)中添加一個(gè)用戶,如"axisuser pass",表示用戶名為axisuser,密碼為pass。然后把案例的Web服務(wù)重新部署,在server-config.wsdd中添加例程7所示的部署代碼。


例程7 重新部署PersonalTaxService

  <service name="PersonalTaxService2" provider="java:RPC">
  <parameter name="allowedMethods" value="*"/>
    <parameter name="className" value="com.hellking.study.webservice.PersonalTaxService"/>
      <parameter name="allowedRoles" value="axisuser"/>
    <requestFlow>
    <handler name="authen"
 type="java:org.apache.axis.handlers.SimpleAuthenticationHandler"/>
    </requestFlow>
  </service>
  

在這個(gè)部署描述符中,指定PersonalTaxService2服務(wù)只能被axisuser訪問(wèn),要想使訪問(wèn)控制生效,還必須把SimpleAuthenticationHandler添加到請(qǐng)求Handler鏈中。

你只要修改AuthClient代碼的服務(wù)端點(diǎn)URL和訪問(wèn)用戶名、密碼,就可以測(cè)試新的Web服務(wù)了,如例程8所示。


例程8 HandlerAuthClient

public class HandlerAuthClient
{
。。。  
String endpointURL = "http://localhost:8080/axis/services/PersonalTaxService2?wsdl";
      。。。
   call.getMessageContext().setUsername("axisuser");//axis中的用戶名。
   call.getMessageContext().setPassword("pass");//密碼
。。。

執(zhí)行HandlerAuthClient,能夠順利訪問(wèn)Web服務(wù);如果修改用戶名或者密碼,那么就不能訪問(wèn),這說(shuō)明Axis的Handler對(duì)Web服務(wù)的訪問(wèn)權(quán)限進(jìn)行了有效的控制。

使用Servlet過(guò)濾器(Filter)進(jìn)行訪問(wèn)控制 Axis的Web服務(wù)端本質(zhì)上是以Servlet方式在運(yùn)行,所有我們完全可以在Web應(yīng)用上部署一個(gè)Servlet過(guò)濾器,通過(guò)此過(guò)濾器來(lái)達(dá)到訪問(wèn)控制的效果。

Web應(yīng)用中的過(guò)濾器截取從客戶端進(jìn)來(lái)的請(qǐng)求,然后進(jìn)行一系列處理,最后把請(qǐng)求發(fā)送到目標(biāo)Servlet。過(guò)濾器的工作原理如下圖所示。


圖1 過(guò)濾器工作原理

過(guò)濾器可以說(shuō)是外部進(jìn)入Web服務(wù)器的第一道關(guān),它能決定請(qǐng)求是否繼續(xù)向前轉(zhuǎn)發(fā),也能對(duì)請(qǐng)求中的信息進(jìn)行處理。如果過(guò)濾器用于對(duì)Web服務(wù)進(jìn)行訪問(wèn)控制,那么它能根據(jù)客戶端信息決定目標(biāo)的服務(wù)是否能調(diào)用成功。

將要開(kāi)發(fā)的過(guò)濾器將根據(jù)客戶端IP地址進(jìn)行過(guò)濾,如果客戶端的IP地址在限制范圍中,那么就不能訪問(wèn)目標(biāo)的Web服務(wù)。過(guò)濾器部分代碼如下。


例程9 用過(guò)濾器限制Web服務(wù)的訪問(wèn)權(quán)限

package com.hellking.study.webservice;

import javax.servlet.FilterChain;
。。。
public class WebServicesFilter implements Filter
{
     //沒(méi)有權(quán)限訪問(wèn)的IP地址
	static final String[] deniedIPList=new String[]{
		               "123.201",
		               "192.168",
		               "25.46",
		               "124.0.0.1"
		            };	
	 public boolean isIPDenied(String ipAddr)
     {
     	…
     }
	
	//過(guò)濾處理的方法
	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("開(kāi)始過(guò)濾。。。");
         if(isIPDenied(clientIp))
		 {
		 	 //驗(yàn)證不成功,讓用戶登錄。
		 	throw new ServletException("無(wú)權(quán)限訪問(wèn)此Web服務(wù)!");
		  }		
		 else
			 {
			 	//驗(yàn)證成功,繼續(xù)處理
			   chain.doFilter(req,res);		 	

			 }	 
		 	
	}	
	…
}

WebServicesFilter 過(guò)濾器限制了deniedIPList中指定的所有客戶端。編寫(xiě)了過(guò)濾器后,需要在Web應(yīng)用的部署描述符中指定使用此過(guò)濾器,并且把過(guò)濾器映射到目標(biāo)URL上。當(dāng)然,你也可以開(kāi)發(fā)其它過(guò)濾器進(jìn)行訪問(wèn)控制,比如Web服務(wù)客戶端登錄時(shí),把登錄信息保存在HTTP會(huì)話中,當(dāng)客戶端訪問(wèn)受限的資源時(shí),讀取HTTP會(huì)話中客戶端信息以決定客戶端是否有權(quán)限訪問(wèn)目標(biāo)資源。

除了編寫(xiě)Servlet過(guò)濾器實(shí)現(xiàn)類(lèi)外,還需要在web.xml中對(duì)它進(jìn)行配置,并且把過(guò)濾器映射到要過(guò)濾的目標(biāo)URI上。以下是過(guò)濾器的部署描述符。


例程10 部署過(guò)濾器

    <filter>
        <filter-name>WebServicesFilter</filter-name>
        <filter-class>com.hellking.study.webservice.WebServicesFilter</filter-class>
    </filter>    
    <filter-mapping>
        <filter-name>WebServicesFilter</filter-name>
        <url-pattern>/services/*</url-pattern>
    </filter-mapping>
    

url-pattern指定了過(guò)濾器要過(guò)濾的范圍。"/services/*"表示以"/services"開(kāi)始的URL將全部被過(guò)濾,這正是AxisServlet默認(rèn)的URL。通過(guò)上面的配置,只要客戶端調(diào)用axis Web服務(wù),就會(huì)被WebServicesFilter過(guò)濾器過(guò)濾。如果客戶端IP地址在過(guò)濾器的deniedIPList中,那么就不能訪問(wèn)目標(biāo)服務(wù)。



回頁(yè)首


使用SSL作為Web服務(wù)的傳輸協(xié)議

Web服務(wù)也可以使用SSL作為傳輸協(xié)議。雖然JAX-RPC并沒(méi)有強(qiáng)制規(guī)定是否使用SSL協(xié)議,但在tomcat下使用HTTPS協(xié)議。

相關(guān)知識(shí):

SSL由兩個(gè)共同工作的協(xié)議組成:"SSL 記錄協(xié)議"(SSL Record Protocol)和"SSL 握手協(xié)議"(SSL Handshake Protocol)。SSL 記錄協(xié)議建立在可靠的傳輸協(xié)議(如TCP)之上,為高層協(xié)議提供數(shù)據(jù)封裝、壓縮、加密等基本功能的支持;SSL 握手協(xié)議建立在SSL記錄協(xié)議之上,用于在實(shí)際的數(shù)據(jù)傳輸開(kāi)始前,通信雙方進(jìn)行身份認(rèn)證、協(xié)商加密算法、交換加密密鑰等。

SSL握手協(xié)議包含兩個(gè)階段,第一個(gè)階段用于建立私密性通信信道,第二個(gè)階段用于客戶認(rèn)證。第一階段是通信的初始化階段,在此階段,首先SSL要求服務(wù)器向?yàn)g覽器出示證書(shū);然后瀏覽器中的SSL軟件發(fā)給服務(wù)器一個(gè)隨機(jī)產(chǎn)生的傳輸密鑰,此密鑰由已驗(yàn)證過(guò)的公鑰加密,隨機(jī)產(chǎn)生的傳輸密鑰是核心機(jī)密,只有客戶的瀏覽器和此公司的Web服務(wù)器知道這個(gè)數(shù)字序列。第二階段的主要任務(wù)是對(duì)客戶進(jìn)行認(rèn)證,此時(shí)服務(wù)器已經(jīng)被認(rèn)證了。服務(wù)器方向客戶發(fā)出認(rèn)證請(qǐng)求消息??蛻羰盏椒?wù)器方的認(rèn)證請(qǐng)求消息后,發(fā)出自己的證書(shū),并且監(jiān)聽(tīng)對(duì)方回送的認(rèn)證結(jié)果。而當(dāng)服務(wù)器收到客戶的證書(shū)后,給客戶回送認(rèn)證成功消息,否則返回錯(cuò)誤消息。到此為止,握手協(xié)議全部結(jié)束。

要使用SSL協(xié)議,服務(wù)器至少有一個(gè)私有密匙和一個(gè)用于驗(yàn)證身份的證書(shū)。私有密匙在密匙交換算法中用到,證書(shū)將發(fā)送到客戶端,以通知服務(wù)器端的身份。如果SSL服務(wù)器要驗(yàn)證客戶端的身份,那么客戶端必須也有自己的密匙庫(kù)(包含私有密匙和證書(shū))。JSSE中引入了信任庫(kù)(truststore)的概念,它是用來(lái)保存證書(shū)的數(shù)據(jù)庫(kù)。客戶端或者服務(wù)器通過(guò)信任庫(kù)來(lái)驗(yàn)證對(duì)方的身份。

在使用SSL前,必須確保系統(tǒng)安裝了JSSE。JDK1.4版本默認(rèn)以及安裝了JSSE。如果沒(méi)有安裝,把下載安裝好的jar文件拷貝到%JAVA_HOME%\ jre\lib\ext目錄下。這樣,就安裝好了JSSE的運(yùn)行環(huán)境。

下面我們使用JDK自帶的工具創(chuàng)建密匙庫(kù)和信任庫(kù)。

1)通過(guò)使用一下的命令來(lái)創(chuàng)建服務(wù)器端的密匙庫(kù)。


        keytool -genkey -alias hellking -keystore server.keystore -keyalg RSA
輸入keystore密碼:  changeit
您的名字與姓氏是什么?
  [Unknown]:  hellking-Server
您的組織單位名稱(chēng)是什么?
  [Unknown]:  huayuan
您的組織名稱(chēng)是什么?
  [Unknown]:  huayuan
您所在的城市或區(qū)域名稱(chēng)是什么?
  [Unknown]:  beijing
您所在的州或省份名稱(chēng)是什么?
  [Unknown]:  beijing
該單位的兩字母國(guó)家代碼是什么
  [Unknown]:  cn
CN=chen ya qiang, OU=huayuan, O=huayuan, L=beijing, ST=beijing, C=cn 正確嗎?
  [否]:  y

輸入<hellking>的主密碼
        (如果和 keystore 密碼相同,按回車(chē)):
        

以上命令執(zhí)行完成后,將獲得一個(gè)名為server.keystore的密匙庫(kù)。

2)生成客戶端的信任庫(kù)。首先輸出RSA證書(shū):


keytool -export -file test_axis.cer -storepass changeit -keystore server.keystore

然后把RSA證書(shū)輸入到一個(gè)新的信任庫(kù)文件中。這個(gè)信任庫(kù)被客戶端使用,被用來(lái)驗(yàn)證服務(wù)器端的身份。


keytool -import -file test_axis.cer -storepass changeit -keystore client.truststore -alias serverkey -noprompt

3)創(chuàng)建客戶端密匙庫(kù)。重復(fù)步驟1,創(chuàng)建客戶端的密匙庫(kù)。也可以使用以下命令來(lái)完成:


keytool -genkey -dname " CN=hellking-Client, OU=tsinghua, O=tsinghua, L=BEIJING, S=BEIJING, C=CN"
-storepass changeit -keystore client.keystore -keyalg RSA -keypass changeit

4)生成服務(wù)器端的信任庫(kù)。


keytool -export -file test_axis.cer -storepass changeit -keystore client.keystore
keytool -import -file test_axis.cer -storepass changeit -keystore server.truststore -alias clientkey -noprompt

生成了密匙庫(kù)和信任庫(kù),我們把服務(wù)器端的密匙庫(kù)(server.keystore)和信任庫(kù)(server.truststore)拷貝到Tomcat的某個(gè)目錄。

下面需要更改Tomcat的配置文件(server.xml),增加一下部署描述符:


例程11 為T(mén)omcat配置SSL協(xié)議。

                  <Connector port="8443" 
               maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
               enableLookups="false" disableUploadTimeout="true"
               acceptCount="100" debug="0" scheme="https" secure="true"
               clientAuth="true" keystoreFile="K:\jakarta-tomcat-5.0.16\server.keystore" keystorePass="changeit"
                 truststoreFile="K:\jakarta-tomcat-5.0.16\server.truststore" truststorePass="changeit"
               sslProtocol="TLS" />
               

clientAuth參數(shù)制定服務(wù)器是否要驗(yàn)證客戶端證書(shū),如果指定為true,那么客戶端必須擁護(hù)服務(wù)器端可信任的證書(shū)后服務(wù)器才能響應(yīng)客戶端;如果指定為false,那么服務(wù)器不需要驗(yàn)證客戶端的證書(shū)。

在此,我們又把PersonalTaxService部署一次,在server-config.wsdd中添加如下部署代碼。


<service name="PersonalTaxService3" provider="java:RPC">
  <parameter name="allowedMethods" value="*"/>
  <parameter name="className" value="com.hellking.study.webservice.PersonalTaxService"/>
  </service>

最后我們需要修改客戶端調(diào)用程序,如例程12所示。


例程12 SSL客戶端調(diào)用程序

package com.hellking.study.webservice;
….
public class SSLAuthClient
{
	static	final double salary=5000;
    public static void main(String [] args)
    {
        try {
        	//服務(wù)端的url,注意使用了SSL協(xié)議后,前綴是https。 
           String endpointURL = "https://localhost:8443/axis/services/PersonalTaxService3?wsdl";
           ….
            //由于使用了證書(shū)數(shù)字證書(shū),所以不使用用戶名和密碼驗(yàn)證。
//call.getMessageContext().setUsername("hellking");。
            //call.getMessageContext().setPassword("simplewebservices");
           ….
            Double ret = (Double) call.invoke( new Object [] { new Double(salary) });
			System.out.println("使用SSL協(xié)議來(lái)作為Web服務(wù)的傳輸協(xié)議!");		
             System.out.println("已經(jīng)成功調(diào)用。請(qǐng)參看服務(wù)端的輸出!");
             System.out.println("輸入工資"+salary+"元,應(yīng)交個(gè)人所得稅:"+ret);
        } catch (Exception e) {
        	e.printStackTrace();
        }
    }
}

最后使用一下的命令來(lái)執(zhí)行客戶端程序:


set AXIS_LIB=K:\jakarta-tomcat-5.0.16\webapps\axis\WEB-INF\lib
SET CLASSPATH=.;%CLASSPATH%;%AXIS_LIB%\wsdl4j.jar.jar;%AXIS_LIB%\axis.jar;%AXIS_LIB%\jaxrpc.jar;%AXIS_LIB%
\saaj.jar;%AXIS_LIB%\commons-discovery.jar;%AXIS_LIB%\commons-logging.jar
java -Djavax.net.ssl.keyStore=client.keystore -Djavax.net.ssl.keyStorePassword=changeit -Djavax.net.ssl.trustStore=client.truststore com.hellking.study.webservice.SSLAuthClient

參數(shù)解釋?zhuān)和ㄟ^(guò)-Djavax.net.ssl.keyStore來(lái)指定客戶端密匙庫(kù),-Djavax.net.ssl.trustStore來(lái)指定客戶端信任庫(kù)。

最后的輸出結(jié)果如下:


使用SSL協(xié)議來(lái)作為Web服務(wù)的傳輸協(xié)議!
已經(jīng)成功調(diào)用。請(qǐng)參看服務(wù)端的輸出!
輸入工資5000.0元,應(yīng)交個(gè)人所得稅:445.0



回頁(yè)首


總結(jié)、下一步

使用Web應(yīng)用模型中基本認(rèn)證方法來(lái)配置Web服務(wù)的安全訪問(wèn)以及使用axis的Handler、Servlet的過(guò)濾器來(lái)進(jìn)行訪問(wèn)控制,它們都是一些輕量級(jí)控制Web服務(wù)安全解決方案,因?yàn)槎际前盐醇用艿男畔⒃诰W(wǎng)絡(luò)上傳播。使用了SSL作為傳輸協(xié)議后,信息在網(wǎng)絡(luò)上是加密傳輸?shù)?,但?duì)資源消耗多,并且對(duì)客戶端要求嚴(yán)格(必須支持SSL),不能滿足Web服務(wù)訪問(wèn)的便利性。下一部分將介紹怎么在安全性要求高的環(huán)境下在axis開(kāi)發(fā)工具里實(shí)現(xiàn)WS-Security。

下載樣例代碼在此。

回頁(yè)首


參考資料

本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊舉報(bào)。
打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
猜你喜歡
類(lèi)似文章
自簽名證書(shū)的WEB服務(wù)安全應(yīng)用
Web Services技術(shù)中的Axis2的使用及Web服務(wù)的發(fā)布
AXIS開(kāi)始Web 服務(wù)
用tomcat和axis開(kāi)發(fā)web服務(wù)
Tomcat+Axis2 WebService配置SSL單向驗(yàn)證
使用Hibernate的一個(gè)完整例子
更多類(lèi)似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長(zhǎng)圖 關(guān)注 下載文章
綁定賬號(hào)成功
后續(xù)可登錄賬號(hào)暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服