`

建立安全的AXIS服务(上)

    博客分类:
  • AXIS
阅读更多

在前面的文章中,我们实现了最简单的AXIS服务。现在我们一起来讨论一下Web服务的安全问题。
根据应用的对安全要求的级别不同,可以采用不同的方式来实现安全性,以下是目前最常用的一些实现方式(从低到高排列):
    1
J2EE Web应用默认的访问控制(数据是明文的); 
    2
、使用axisHandler进行访问控制(数据是明文的); 
    3
、使用Servlet过滤器(Filter)进行访问控制(数据是明文的); 
    4
、使用SSL/HTTPS协议来传输(加密的数据传输协议); 
    5
、使用WS-Security规范对信息进行加密与身份认证(数据被加密传输)。
我们仅讨论第245种实现方式。在此之前我们先来了解一下AXIS自带的一个工具SOAPMonitor
一、SOAPMonitor的使用
  
打开http://localhost:8080/axis/进入AXIS的主页面,你会看见:
   SOAPMonitor-[disabled by default for security reasons] 
,默认状态下其是不可用的,现在我们就来激活它。
   
1
、到目录%TOMCAT_HOME%\webapps\axis下,你会找到SOAPMonitorApplet.java,在命令行中编译它:   


javac -classpath %AXIS_HOME%\lib\axis.jar SOAPMonitorApplet.java

  
   编译完之后你会看见目录下多了很多CLASS文件,它们的名字是SOAPMonitorApplet*.class

2
、在目录%TOMCAT_HOME%\webapps\axis\WEB-INF下打开server-config.wsdd文件,将下面的两部分代码直
   
接加入其中相应的位置
   
第一部分:
 


<
handler name="soapmonitor"   type="java:org.apache.axis.handlers.SOAPMonitorHandler">
        
<parameter name="wsdlURL"   value="/axis/SOAPMonitorService-impl.wsdl"/>
        
<parameter name="namespace"   value="http://tempuri.org/wsdl/2001/12/SOAPMonitorService-impl.wsdl"/>
        
<parameter name="serviceName" value="SOAPMonitorService"/>
        
<parameter name="portName" value="Demo"/>
      
</handler>

     
   第二部分:

     
 
<service name="SOAPMonitorService" provider="java:RPC">
        
<parameter name="allowedMethods" value="publishMessage"/>
        
<parameter name="className"   value="org.apache.axis.monitor.SOAPMonitorService"/>
        
<parameter name="scope" value="Application"/>
      
</service>



3
、选择你要监控的服务
   
以上次的HelloWorld服务为例,在server-config.wsdd中你会找到这段代码

    
<service name="HelloWorld" provider="java:RPC">
       
<parameter name="allowedMethods" value="sayHello"/>
       
<parameter name="className" value="HelloWorld"/>
    
</service>


   
在这段代码中加入以下的代码:

    
<
requestFlow>
      
<handler type="soapmonitor"/>
    
</requestFlow>
    
<responseFlow>
      
<handler type="soapmonitor"/>
    
</responseFlow>


   
最后的样子是:

    
<service name="HelloWorld" provider="java:RPC">
    
<requestFlow>
      
<handler type="soapmonitor"/>
    
</requestFlow>
    
<responseFlow>
      
<handler type="soapmonitor"/>
    
</responseFlow>
    
<parameter name="allowedMethods" value="sayHello"/>
    
<parameter name="className" value="HelloWorld"/>
    
</service>


   
这样HelloWorld服务就被监控了
   
4
、启动Tomcat,打开http://localhost:8080/axis/SOAPMonitor,你就会看到Applet界面,在
   jbuilder2005
中运行我们上次写的客户端程序 TestClient.javaOK!你会在Applet界面看
   
见客户端与服务器端互发的XML内容,注意这里是明文!
   
二、使用axisHandler进行访问控制(对安全要求不高时推荐)
   axis
Web服务的访问控制提供了相关的配置描述符,并且提供了一个访问控制的简单  Handler。默认情况下,你只要在配置描述符中添加用户,然后在Web服务器的部署描述符中自动允许的角色即可。

1
、在axis的配置文件users.lst(位于WEB-INF目录下)中添加一个用户,如"ronghao1111",表示
   
用户名为ronghao,密码为1111
   
2
、把例HelloWorldWeb服务重新部署(新加的部分已标出)

    
<service name="HelloWorld" provider="java:RPC">
    
<requestFlow>
      
<handler type="soapmonitor"/>
      
<handler type="Authenticate"/>  //新加的AXIS自带的Handler
    </requestFlow>
    
<responseFlow>
      
<handler type="soapmonitor"/>
    
</responseFlow>
    
<parameter name="allowedMethods" value="sayHello"/>
    
<parameter name="allowedRoles" value="ronghao"/>    //注意,这里是新加的部分!
    <parameter name="className" value="HelloWorld"/>
   
</service>


  
在这个部署描述符中,指定HelloWorld服务只能被ronghao访问
   
3
、修改客户端程序 TestClient.java,增加访问用户名、密码(新加的部分已标出)

   
TestClient.java

import org.apache.axis.client.Call;
import org.apache.axis.client.Service;
import javax.xml.rpc.ParameterMode;

public class TestClient
{
   
public static void main(String [] args) throws Exception {
   String endpoint 
= "http://localhost:" +"8080"+ "/axis/HelloWorld";

       Service  service 
= new Service();  
       Call     call    
= (Call) service.createCall();
       call.getMessageContext().setUsername(
"ronghao");//  用户名。
       call.getMessageContext().setPassword("1111");//   密码
     call.setTargetEndpointAddress( new java.net.URL(endpoint) );

     call.setOperationName( 
"sayHello" );
     String res 
= (String) call.invoke( new Object[] {} );

     System.out.println( res );
   }
}


  
执行TestClient,能够顺利访问Web服务;如果修改用户名或者密码,那么就不能访问 。同样,
  
你在http://localhost:8080/axis/SOAPMonitor中看到的请求和响应的XML是明文!
  
三、使用SSL/HTTPS协议来传输
    Web
服务也可以使用SSL作为传输协议。虽然JAX-RPC并没有强制规定是否使用SSL协议,但在tomcat 下使用HTTPS协议。
1
、使用JDK自带的工具创建密匙库和信任库。

  1
)通过使用以下的命令来创建服务器端的密匙库:

  
 keytool 
-genkey -alias Server -keystore server.keystore -keyalg RSA
  输入keystore密码:  changeit
  您的名字与姓氏是什么?
  [Unknown]:  Server
  您的组织单位名称是什么?
  [Unknown]:  ec
  您的组织名称是什么?
  [Unknown]:  ec
  您所在的城市或区域名称是什么?
  [Unknown]:  beijing
  您所在的州或省份名称是什么?
  [Unknown]:  beijing
  该单位的两字母国家代码是什么
  [Unknown]:  CN
CN
=Server, OU=ec, O=ec, L=beijing, ST=beijing, C=CN 正确吗?
  [否]:  y

输入
<Server>的主密码
        (如果和 keystore 密码相同,按回车):


   
以上命令执行完成后,将获得一个名为server.keystore的密匙库。
   
  2)
生成客户端的信任库。首先输出RSA证书:
 


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


  
然后把RSA证书输入到一个新的信任库文件中。这个信任库被客户端使用,被用来验证服务器端的身份。
 


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


  
以上命令执行完成后,将获得一个名为client.truststore的信任库。
  
  3
)同理生成客户端的密匙库client.keystore和服务器端的信任库server.truststore.方便起见给出.bat文件
     gen-cer-store.bat
内容如下:

     
     set SERVER_DN
="CN=Server, OU=ec, O=ec, L=BEIJINGC, S=BEIJING, C=CN"
     set CLIENT_DN
="CN=Client, OU=ec, O=ec, L=BEIJING, S=BEIJING, C=CN"
     set KS_PASS
=-storepass changeit
     set KEYINFO
=-keyalg RSA

     keytool 
-genkey -alias Server -dname %SERVER_DN% %KS_PASS% -keystore server.keystore %KEYINFO% -keypass changeit
     keytool 
-export -alias Server -file test_axis.cer %KS_PASS% -keystore server.keystore
     keytool 
-import -file test_axis.cer %KS_PASS% -keystore client.truststore -alias serverkey -noprompt

     keytool 
-genkey -alias Client -dname %CLIENT_DN% %KS_PASS% -keystore client.keystore %KEYINFO% -keypass changeit
     keytool 
-export -alias Client -file test_axis.cer %KS_PASS% -keystore client.keystore
     keytool 
-import -file test_axis.cer %KS_PASS% -keystore server.truststore -alias clientkey -noprompt


     
  
好的,现在我们就有了四个文件:server.keystoreserver.truststoreclient.keystoreclient.truststore
  
2
、更改Tomcat的配置文件(server.xml),增加以下部署描述符:(其实里面有,只是被注释掉了)

      
<
Connector port="8440" 
               maxThreads
="150" minSpareThreads="25" maxSpareThreads="75"
               enableLookups
="false" disableUploadTimeout="true"
               acceptCount
="100" scheme="https" secure="true"
               clientAuth
="true" keystoreFile="f:\server.keystore" keystorePass="changeit"
                 truststoreFile
="f:\server.truststore" truststorePass="changeit"
               sslProtocol
="TLS" />



3
、把HelloWorld重新部署一次,在server-config.wsdd中修改如下部署代码。(还原了而已)

    
<
service name="HelloWorld" provider="java:RPC">
    
<requestFlow>
      
<handler type="soapmonitor"/>
    
</requestFlow>
    
<responseFlow>
      
<handler type="soapmonitor"/>
    
</responseFlow>
    
<parameter name="allowedMethods" value="sayHello"/>
    
<parameter name="className" value="HelloWorld"/>
    
</service>


    
4
、修改客户端程序 TestClient.java(修改的部分已标出)


public
 class TestClient
{
   
public static void main(String [] args) throws Exception {
   String endpoint 
= "https://localhost:" +"8440"+ "/axis/HelloWorld";//注意区别在这里!https!

       Service  service 
= new Service();  
       Call     call    
= (Call) service.createCall();
     call.setTargetEndpointAddress( 
new java.net.URL(endpoint) );

     call.setOperationName( 
"sayHello" );
     String res 
= (String) call.invoke( new Object[] {} );

     System.out.println( res );
   }
}



5
、最后使用命令来执行客户端程序


java 
-cp %AXISCLASSPATH%
     
-Djavax.net.ssl.keyStore=client.keystore 
     
-Djavax.net.ssl.keyStorePassword=changeit 
     
-Djavax.net.ssl.trustStore=client.truststore 
     TestClient

 

 

分享到:
评论

相关推荐

    axis2jar包

    在Java世界中,Axis2以其强大的功能和灵活性而闻名,它建立在 Axis1 的基础上,改进了性能并引入了许多新特性。Axis2的核心组件是以模块化的方式构建的,这使得开发者可以根据需要选择和配置特定的功能。 1. **Web...

    axis JAR包,axis 完整包

    Axis是一款开源的Web服务开发工具,它主要用于创建和部署SOAP(简单对象访问协议)服务,同时也支持WS-I(Web服务互操作性)规范。在Java环境中,Axis使得开发者能够轻松地将现有的Java类转换为Web服务,或者消费由...

    Webservice之Axis高级编程

    4. **AXIS第四课:AXIS高级应用,建立安全的AXIS服务** 安全性是Web服务不可或缺的一部分。在这一课,我们将探讨如何在Axis中实现安全性,包括使用HTTPS协议、WS-Security规范(如数字签名和加密)来保护数据传输的...

    axis2-1.4插件

    这个框架是建立在 Axis1 的基础上,但设计更加模块化和可扩展。Axis2-1.4 版本是该框架的一个稳定版本,提供了许多改进和新特性。 1. **模块化设计**:Axis2 的模块化设计使得它可以根据需求来选择和配置不同的功能...

    axis2-1.8.0apache-cxf-3.4.4.rar

    2. **模块化架构**:Axis2采用模块化设计,允许开发者按需选择和组合功能,比如安全、事务处理和性能优化模块。 3. **Message Receiver**:Axis2支持多种消息接收器,如HTTP、JMS或本地调用,这使得它能与不同的...

    axis2-1.5.5-bin.zip

    Axis2是建立在AXIOM(Axis Object Model)之上的,AXIOM是一个高效的XML信息对象模型,它为处理SOAP消息提供了强大的支持。Axis2的设计目标是提高性能、可扩展性和灵活性,使其成为构建复杂Web服务的理想选择。其...

    APACHE AXIS2

    1. **高性能**:Axis2在设计上采用了模块化架构,使得其能够高效地处理大量的Web服务请求。 2. **灵活性**:支持多种传输协议如HTTP、HTTPS等,并且可以轻松地与其他Java应用程序集成。 3. **安全性**:提供了一套...

    AXIS2+Myeclipse实现WebService数据库存储简单实例

    为了实现这个实例,开发者首先需要在Myeclipse中创建一个新的AXIS2 Web服务项目,然后导入`webbook.sql`并执行来建立数据库环境。接着,编写服务器端代码,定义服务接口和实现,确保它们能够正确连接到数据库并执行...

    java 调用https webservice实例及axis包

    注意,由于是HTTPS,所以在调用前可能需要建立SSL连接,处理身份验证等安全操作。 5. **处理异常**:在调用过程中,可能会遇到SSL相关的异常,如`CertificateException`, `KeyManagementException`, `...

    建立Web服务.rar

    综上所述,建立Web服务是一个涉及接口设计、实现、发布、测试、安全和维护等多个环节的过程。选择合适的技术栈、遵循最佳实践并注重安全性,将有助于构建高效、可靠的Web服务,实现跨系统的数据交换和业务协同。

    axis安讯士摄像头rtsp视频流数据获取程序

    "Axis安讯士摄像头rtsp视频流数据获取程序" 是一个专用于与Axis品牌安讯士摄像头进行交互的软件程序,主要功能是获取并处理来自摄像头的实时传输协议(RTSP)视频流数据。Axis安讯士是知名的专业网络摄像头制造商,...

    WebServices With Apache Axis.pdf

    3. **部署Web服务**:将生成的Java源代码编译成字节码,并将其部署到Axis2服务器上。这通常涉及到创建一个服务归档(Service Archive, AAR)文件,然后通过管理控制台或命令行工具上传。 4. **启动服务**:一旦服务...

    axis2大讲堂word版

    通过这个“Axis2大讲堂”,你可以逐步建立起对Web服务开发和Axis2框架的深入理解,从而提高你的开发技能和项目实施能力。无论是初学者还是有经验的开发者,都能从中受益匪浅,提升自己的专业素养。

    axis2学习资料Java示例代码.zip

    2. **客户端代码**:客户端代码通常包含一个或多个调用服务的方法,使用Axis2的Stub或ServiceClient类来建立与服务的连接并发送请求。它可能还包括了处理响应和异常的部分。 3. **依赖包axis2**:这个可能是一个...

    axis开发webservices.doc

    本文介绍了使用Axis2开发Web服务的基本流程,从获取和部署Axis2到建立自定义Web服务的过程。通过对SOAP请求的解析和响应的生成,我们可以实现对特定数据的处理。此外,通过直接操作系统目录级的方式,可以更加灵活地...

    基于soap over jms 的websphere mq与axis2的实现

    4. **连接 Axis2 和 WebSphere MQ**:编写或配置 Axis2 应用程序,使其能够通过JMS API与WebSphere MQ建立连接,发送和接收消息。 5. **测试和调试**:通过发送SOAP请求到Axis2服务,验证消息是否正确地通过...

Global site tag (gtag.js) - Google Analytics