本站不再更新,歡迎光臨 java開發(fā)技術(shù)網(wǎng)
          隨筆-230  評論-230  文章-8  trackbacks-0
          本文首先簡單介紹Web服務(wù)安全性基本概念,然后介紹在axis Web服務(wù)開發(fā)工具下處理安全性問題的一些常用方法;接下來以安全性實現(xiàn)方法為線索,介紹了怎么在Web應(yīng)用的基礎(chǔ)上配置Web服務(wù)的訪問控制、怎么使用axis的Handler和Servlet的過濾器進行訪問控制,最后討論怎么在tomcat下配置SSL 以實現(xiàn)Web服務(wù)的安全傳輸。

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

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

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

          本文的參考資料見 參考資料

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

          Web服務(wù)安全概述

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

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

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

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

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

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

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



          回頁首


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

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

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


          例程 1 個人所得稅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;//計算后的所得稅。    	
              	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)的適當位置增加以下部署代碼,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 (請先部署好這個Web服務(wù)再進行下面的學習。)



          回頁首


          從Web應(yīng)用的基本認證說起

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

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

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

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


          例程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配置文件中添加了一個department-manager角色,并且在此角色中添加了一個名為hellking的用戶。要使tomcat-users.xml中配置的角色和用戶生效,需要配置tomcat使用UserDatabaseRealm。打開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ù)資源的訪問控制,如下所示:


          例程5 配置對Servlet的訪問控制(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指定了需要通過角色驗證的URL樣式,在這里是"/services/PersonalTaxService";role-name是能夠訪問制定URL的角色,這里是department-manager。以上配置的意思是只有角色類型是"department-manager"的用戶才能訪問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)用需要驗證的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ù)端點地址            
                      Service  service = new Service();
                      Call     call    = (Call) service.createCall();
                      call.setTargetEndpointAddress( new java.net.URL(endpointURL) );
                      call.setOperationName( new QName("PersonalTaxService", "getTax") );//設(shè)置操作的名稱。
                      //由于需要認證,故需要設(shè)置調(diào)用的用戶名和密碼。
                      call.getMessageContext().setUsername("hellking");//設(shè)置用戶名。
                      call.getMessageContext().setPassword("simplewebservices");//設(shè)置密碼
                      call.addParameter( "op1", XMLType.XSD_DOUBLE, ParameterMode.IN );//參數(shù)的類型
          		   call.setReturnType( XMLType.XSD_DOUBLE );//返回的數(shù)據(jù)類型
                      Double ret = (Double) call.invoke( new Object [] { new Double(salary) });//執(zhí)行調(diào)用
          		  System.out.println("使用HTTP協(xié)議來作為Web服務(wù)的傳輸協(xié)議!");			
                      System.out.println("已經(jīng)成功調(diào)用。請參看服務(wù)端的輸出!");
                      System.out.println("輸入工資"+salary+"元,應(yīng)交個人所得稅:"+ret);
               。。。
              }
          }
          

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

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

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

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



          回頁首


          使用axis的Handler進行訪問控制

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

          首先在axis的配置文件users.lst(位于WEB-INF目錄下)中添加一個用戶,如"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>
            

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

          你只要修改AuthClient代碼的服務(wù)端點URL和訪問用戶名、密碼,就可以測試新的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,能夠順利訪問Web服務(wù);如果修改用戶名或者密碼,那么就不能訪問,這說明Axis的Handler對Web服務(wù)的訪問權(quán)限進行了有效的控制。

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

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


          圖1 過濾器工作原理
          圖1 過濾器工作原理

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

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


          例程9 用過濾器限制Web服務(wù)的訪問權(quán)限
          
          package com.hellking.study.webservice;
          
          import javax.servlet.FilterChain;
          。。。
          public class WebServicesFilter implements Filter
          {
               //沒有權(quán)限訪問的IP地址
          	static final String[] deniedIPList=new String[]{
          		               "123.201",
          		               "192.168",
          		               "25.46",
          		               "124.0.0.1"
          		            };	
          	 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)用的部署描述符中指定使用此過濾器,并且把過濾器映射到目標URL上。當然,你也可以開發(fā)其它過濾器進行訪問控制,比如Web服務(wù)客戶端登錄時,把登錄信息保存在HTTP會話中,當客戶端訪問受限的資源時,讀取HTTP會話中客戶端信息以決定客戶端是否有權(quán)限訪問目標資源。

          除了編寫Servlet過濾器實現(xiàn)類外,還需要在web.xml中對它進行配置,并且把過濾器映射到要過濾的目標URI上。以下是過濾器的部署描述符。


          例程10 部署過濾器
          
              <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指定了過濾器要過濾的范圍。"/services/*"表示以"/services"開始的URL將全部被過濾,這正是AxisServlet默認的URL。通過上面的配置,只要客戶端調(diào)用axis Web服務(wù),就會被WebServicesFilter過濾器過濾。如果客戶端IP地址在過濾器的deniedIPList中,那么就不能訪問目標服務(wù)。



          回頁首


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

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

          相關(guān)知識:

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

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

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

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

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

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

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

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

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

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

          然后把RSA證書輸入到一個新的信任庫文件中。這個信任庫被客戶端使用,被用來驗證服務(wù)器端的身份。

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

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

          
          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ù)器端的信任庫。

          
          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
          

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

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


          例程11 為Tomcat配置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ù)器是否要驗證客戶端證書,如果指定為true,那么客戶端必須擁護服務(wù)器端可信任的證書后服務(wù)器才能響應(yīng)客戶端;如果指定為false,那么服務(wù)器不需要驗證客戶端的證書。

          在此,我們又把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ù)字證書,所以不使用用戶名和密碼驗證。
          //call.getMessageContext().setUsername("hellking");。
                      //call.getMessageContext().setPassword("simplewebservices");
                     ….
                      Double ret = (Double) call.invoke( new Object [] { new Double(salary) });
          			System.out.println("使用SSL協(xié)議來作為Web服務(wù)的傳輸協(xié)議!");		
                       System.out.println("已經(jīng)成功調(diào)用。請參看服務(wù)端的輸出!");
                       System.out.println("輸入工資"+salary+"元,應(yīng)交個人所得稅:"+ret);
                  } catch (Exception e) {
                  	e.printStackTrace();
                  }
              }
          }
          

          最后使用一下的命令來執(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ù)解釋:通過-Djavax.net.ssl.keyStore來指定客戶端密匙庫,-Djavax.net.ssl.trustStore來指定客戶端信任庫。

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

          
          使用SSL協(xié)議來作為Web服務(wù)的傳輸協(xié)議!
          已經(jīng)成功調(diào)用。請參看服務(wù)端的輸出!
          輸入工資5000.0元,應(yīng)交個人所得稅:445.0
          
          posted on 2006-02-24 11:04 有貓相伴的日子 閱讀(1175) 評論(0)  編輯  收藏

          只有注冊用戶登錄后才能發(fā)表評論。


          網(wǎng)站導(dǎo)航:
           
          <2025年7月>
          293012345
          6789101112
          13141516171819
          20212223242526
          272829303112
          3456789

          常用鏈接

          留言簿(32)

          隨筆分類(222)

          隨筆檔案(224)

          文章分類(4)

          文章檔案(7)

          相冊

          收藏夾(4)

          最新評論

          閱讀排行榜

          評論排行榜

          本站不再更新,歡迎光臨 java開發(fā)技術(shù)網(wǎng)
          主站蜘蛛池模板: 石景山区| 同德县| 津市市| 巴里| 云安县| 万宁市| 佛学| 汽车| 修水县| 巨野县| 华亭县| 西和县| 崇文区| 秦皇岛市| 台山市| 遵义市| 德保县| 咸宁市| 揭西县| 上杭县| 新河县| 安泽县| 平塘县| 福州市| 清水县| 天柱县| 文成县| 武安市| 三门峡市| 广宗县| 眉山市| 大化| 灌云县| 德江县| 文化| 石台县| 永新县| 日土县| 同德县| 神木县| 唐山市|