建立安全的AXIS服务

Axis工具在Web服务中的应用与实践 本文还有配套的精品资源,点击获取 简介:Web服务通过SOAP和WSDL实现不同系统间的数据交换和功能共享。Axis是一个开放源代码的SOAP引擎,基于Java平台,为开发者提供了强大的工具来构建、发布和调用Web服务。它简化了从定义服务接口到部署和调用的过程,同时支持多种传输协议和数据编码方式。Axis还提供了扩展机制以解决开发中的挑战,如数据类型映射和错误处理,并支持W... 阅读详情
 

建立安全的AXIS服务
在前面的文章中,我们实现了最简单的AXIS服务。现在我们一起来讨论一下Web服务的安全问题。
根据应用的对安全要求的级别不同,可以采用不同的方式来实现安全性,以下是目前最常用的一些实现方式(从低到高排列):
    1、J2EE Web应用默认的访问控制(数据是明文的); 
    2、使用axis的Handler进行访问控制(数据是明文的); 
    3、使用Servlet过滤器(Filter)进行访问控制(数据是明文的); 
    4、使用SSL/HTTPS协议来传输(加密的数据传输协议); 
    5、使用WS-Security规范对信息进行加密与身份认证(数据被加密传输)。
我们仅讨论第2、4、5种实现方式。在此之前我们先来了解一下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.java。OK!你会在Applet界面看
   见客户端与服务器端互发的XML内容,注意这里是明文!
   
二、使用axis的Handler进行访问控制(对安全要求不高时推荐)
   axis为Web服务的访问控制提供了相关的配置描述符,并且提供了一个访问控制的简单  Handler。默认情况下,你只要在配置描述符中添加用户,然后在Web服务器的部署描述符中自动允许的角色即可。

1、在axis的配置文件users.lst(位于WEB-INF目录下)中添加一个用户,如"ronghao1111",表示
   用户名为ronghao,密码为1111。
   
2、把例HelloWorld的Web服务重新部署(新加的部分已标出)
    <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.keystore,server.truststore,client.keystore,client.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

四、使用WS-Security规范对信息进行加密与身份认证
    我们打算用Handler结合WSSecurity实现Web服务安全(Handler的有关内容请参阅AXIS学习笔记(二))
    设想流程:用WSClientRequestHandler.java位于客户端对客户端发出的XML文档进行加密
                WSServerRequestHandler.java位于服务器端对客户端发出的加密后的XML文档进行解密
                WSServerResponseHandler.java位于服务器端对服务器端返回的XML文档进行加密
                WSClientResponseHandler.java位于客户端对服务器端返回的XML文档进行解密
                
 1、使用ISNetworks安全提供者,ISNetworks实现了RSA加密、解密算法。
    当然,你也可以使用其它的安全提供者,并且可以使用不同的加密算法。
    ISNetworks相关包ISNetworksProvider.jar。拷贝到%TOMCAT_HOME%     /webapps/axis/WEB-INF/lib
    
 2、Trust Services Integration Kit提供了一个WS-Security实现。你可以从http://www.xmltrustcenter.org获得相关库文件,分别是ws-security.jar和tsik.jar。ws-security.jar中包含一个WSSecurity类,我们使用它来对XML进行数字签名和验证,加密与解密。同样拷贝到%TOMCAT_HOME%/webapps/axis/WEB-INF/lib

 3、创建密匙库和信任库。(见上文,一模一样!)
     
 4、框架结构
    WSClientHandler.java  //基类,包含了一些公用方法
    WSClientRequestHandler.java //继承于WSClientHandler.java,调用WSHelper.java对客户端发出的XML文档进行加密
    WSClientResponseHandler.java //继承于WSClientHandler.java,调用WSHelper.java对服务器端返回的XML文档进行解密
    WSServerHandler.java //基类,包含了一些公用方法
    WSServerRequestHandler.java //继承于WSServerHandler.java,调用WSHelper.java对客户端发出的加密后的XML文档进行解密
    WSServerResponseHandler.java//继承于WSServerHandler.java,调用WSHelper.java对服务器端返回的XML文档进行加密
    WSHelper.java //核心类,对SOAP消息签名、加密、解密、身份验证
    MessageConverter.java  //帮助类,Document、SOAP消息互相转换
  
 5、具体分析(在此强烈建议看一下tsik.jar的API)
    WSHelper.java 
    public class WSHelper {
        static String PROVIDER="ISNetworks";//JSSE安全提供者。
  //添加JSSE安全提供者,你也可以使用其它安全提供者。只要支持DESede算法。这是程序里动态加载还可以在JDK中静态加载
        static
        {
         java.security.Security.addProvider(new com.isnetworks.provider.jce.ISNetworksProvider());
    }
    /**
     *对XML文档进行数字签名。
     */
        public static void sign(Document doc, String keystore, String storetype,
                                                String storepass, String alias, String keypass) throws Exception {
                FileInputStream fileInputStream = new FileInputStream(keystore);
                java.security.KeyStore keyStore = java.security.KeyStore.getInstance(storetype);
                keyStore.load(fileInputStream, storepass.toCharArray());
                PrivateKey key = (PrivateKey)keyStore.getKey(alias, keypass.toCharArray());
                X509Certificate cert = (X509Certificate)keyStore.getCertificate(alias);
                SigningKey sk = SigningKeyFactory.makeSigningKey(key);
                KeyInfo ki = new KeyInfo();
                ki.setCertificate(cert);
                WSSecurity wSSecurity = new WSSecurity();//ws-security.jar中包含的WSSecurity类
                wSSecurity.sign(doc, sk, ki);//签名。


        }
    /**
     *对XML文档进行身份验证。
     */
        public static boolean verify(Document doc, String keystore, String storetype,
                                                String storepass) throws Exception {
                FileInputStream fileInputStream = new FileInputStream(keystore);
                java.security.KeyStore keyStore = java.security.KeyStore.getInstance(storetype);
                keyStore.load(fileInputStream, storepass.toCharArray());
                TrustVerifier verifier = new X509TrustVerifier(keyStore);
                WSSecurity wSSecurity = new WSSecurity();
                MessageValidity[] resa = wSSecurity.verify(doc, verifier, null,null);
                if (resa.length > 0)
                        return resa[0].isValid();
                return false;
        }
   /**
    *对XML文档进行加密。必须有JSSE提供者才能加密。
    */
        public static void encrypt(Document doc, String keystore, String storetype,
                                                String storepass, String alias) throws Exception {
                try
                {
                FileInputStream fileInputStream = new FileInputStream(keystore);
                java.security.KeyStore keyStore = java.security.KeyStore.getInstance(storetype);
                keyStore.load(fileInputStream, storepass.toCharArray());
                X509Certificate cert = (X509Certificate)keyStore.getCertificate(alias);
                PublicKey pubk = cert.getPublicKey();
                KeyGenerator keyGenerator = KeyGenerator.getInstance("DESede",PROVIDER);
                keyGenerator.init(168, new SecureRandom());
                SecretKey key = keyGenerator.generateKey();
                KeyInfo ki = new KeyInfo();
                ki.setCertificate(cert);
                WSSecurity wSSecurity = new WSSecurity();
                //加密。
                wSSecurity.encrypt(doc, key, AlgorithmType.TRIPLEDES, pubk, AlgorithmType.RSA1_5, ki);
        }
        catch(Exception e)
        {
                e.printStackTrace();
        }
        }
    /**
     *对文档进行解密。
     */
        public static void decrypt(Document doc, String keystore, String storetype,
                                                String storepass, String alias, String keypass) throws Exception {
                FileInputStream fileInputStream = new FileInputStream(keystore);
                java.security.KeyStore keyStore = java.security.KeyStore.getInstance(storetype);
                keyStore.load(fileInputStream, storepass.toCharArray());
                PrivateKey prvk2 = (PrivateKey)keyStore.getKey(alias, keypass.toCharArray());

                WSSecurity wSSecurity = new WSSecurity();
                //解密。

                wSSecurity.decrypt(doc, prvk2, null);
                WsUtils.removeEncryptedKey(doc);//从 WS-Security Header中删除 EncryptedKey 元素
        }

        public static void removeWSSElements(Document doc) throws Exception {
                WsUtils.removeWSSElements(doc);// 删除WSS相关的元素。
        }

}

   WSClientHandler.java
   //继承自org.apache.axis.handlers.BasicHandler即AXIS内在的
   public class WSClientHandler extends BasicHandler{
  protected String keyStoreFile ;
  protected  String keyStoreType ="JKS";//默认
  protected String keyStorePassword ;
  protected String keyAlias ;
  protected String keyEntryPassword ;
  protected String trustStoreFile ;
  protected String trustStoreType = "JKS";//默认
  protected String trustStorePassword ;
  protected String certAlias ;

  public void setInitialization(String keyStoreFile,String keyStoreType,String keyStorePassword,
                 String keyAlias,String keyEntryPassword,String trustStoreFile,
                 String trustStoreType,String trustStorePassword,String certAlias){
  this.keyStoreFile=keyStoreFile;
  this.keyStoreType=keyStoreType;
  this.keyStorePassword=keyStorePassword;
  this.keyAlias=keyAlias;
  this.keyEntryPassword=keyEntryPassword;
  this.trustStoreFile=trustStoreFile;
  this.trustStoreType=trustStoreType;
  this.trustStorePassword=trustStorePassword;
  this.certAlias=certAlias;
}
  public void setInitialization(String keyStoreFile,String keyStorePassword,
                String keyAlias,String keyEntryPassword,String trustStoreFile,
                String trustStorePassword,String certAlias){
  this.keyStoreFile=keyStoreFile;
  this.keyStorePassword=keyStorePassword;
  this.keyAlias=keyAlias;
  this.keyEntryPassword=keyEntryPassword;
  this.trustStoreFile=trustStoreFile;
  this.trustStorePassword=trustStorePassword;
  this.certAlias=certAlias;
}
  public void invoke(MessageContext messageContext) throws AxisFault {//在这个方法里对XML文档进行处理
    //do nothing now!
  }
  public void onFault(MessageContext msgContext) {
    System.out.println("处理错误,这里忽略!");
        }
}
  
  WSClientRequestHandler.java
  public class WSClientRequestHandler extends WSClientHandler{
  public void invoke(MessageContext messageContext) throws AxisFault {
    try {

     SOAPMessage soapMessage = messageContext.getMessage();
     Document doc = MessageConverter.convertSoapMessageToDocument(soapMessage); //soapMessage转换为Document
     WSHelper.sign(doc, keyStoreFile, keyStoreType,keyStorePassword, keyAlias, keyEntryPassword); //数字签名
     WSHelper.encrypt(doc, trustStoreFile, trustStoreType, trustStorePassword, certAlias); //加密
     soapMessage = MessageConverter.convertDocumentToSOAPMessage(doc); 
//处理后的Document再转换回soapMessage
     messageContext.setMessage(soapMessage);
     } catch (Exception e){
     System.err.println("在处理响应时发生以下错误: " + e);
      e.printStackTrace();  }
        }
}  

  WSClientResponseHandler.java
  public class WSClientResponseHandler extends WSClientHandler{
  public void invoke(MessageContext messageContext) throws AxisFault {
    try {

            SOAPMessage soapMessage =  messageContext.getCurrentMessage();
            Document doc = MessageConverter.convertSoapMessageToDocument(soapMessage);

        WSHelper.decrypt(doc, keyStoreFile, keyStoreType,
                            keyStorePassword, keyAlias, keyEntryPassword);//解密

            WSHelper.verify(doc, trustStoreFile, trustStoreType, trustStorePassword);//验证
            WSHelper.removeWSSElements(doc);
            soapMessage = MessageConverter.convertDocumentToSOAPMessage(doc);
            messageContext.setMessage(soapMessage);
    } catch (Exception e){
            e.printStackTrace();
            System.err.println("在处理响应时发生以下错误: " + e);
                         }

        }
}    
   
   WSServerHandler.java 
   public class WSServerHandler extends BasicHandler{
  protected String keyStoreFile ;
  protected  String keyStoreType ="JKS";//默认
  protected String keyStorePassword ;
  protected String keyAlias ;
  protected String keyEntryPassword ;
  protected String trustStoreFile ;
  protected String trustStoreType = "JKS";//默认
  protected String trustStorePassword ;
  protected String certAlias ;

  public void invoke(MessageContext messageContext) throws AxisFault {
    //do nothing now!
  }
  public void onFault(MessageContext msgContext) {
    System.out.println("处理错误,这里忽略!");
        }
  public void init() { //初始化,从配置文件server-config.wsdd中读取属性
    keyStoreFile = (String)getOption("keyStoreFile");
    if(( keyStoreFile== null) )
      System.err.println("Please keyStoreFile configured for the Handler!");
    trustStoreFile = (String)getOption("trustStoreFile");
     if((  trustStoreFile== null) )
    System.err.println("Please trustStoreFile configured for the Handler!");
    keyStorePassword = (String)getOption("keyStorePassword");
     if(( keyStorePassword== null) )
    System.err.println("Please keyStorePassword configured for the Handler!");
    keyAlias = (String)getOption("keyAlias");
     if(( keyAlias== null) )
    System.err.println("Please keyAlias configured for the Handler!");
    keyEntryPassword = (String)getOption("keyEntryPassword");
     if(( keyEntryPassword== null) )
    System.err.println("Please keyEntryPassword configured for the Handler!");
    trustStorePassword = (String)getOption("trustStorePassword");
     if(( trustStorePassword== null) )
    System.err.println("Please trustStorePassword configured for the Handler!");
    certAlias = (String)getOption("certAlias");
    if ((certAlias==null))
        System.err.println("Please certAlias configured for the Handler!");
    if ((getOption("keyStoreType")) != null)
       keyStoreType = (String)getOption("keyStoreType");
    if ((getOption("trustStoreType")) != null)
       trustStoreType = (String)getOption("trustStoreType");
    }
}         
    
    WSServerRequestHandler.java 
    public class WSServerRequestHandler extends WSServerHandler{
  public void invoke(MessageContext messageContext) throws AxisFault {
    try {
      SOAPMessage msg = messageContext.getCurrentMessage();
            Document doc = MessageConverter.convertSoapMessageToDocument(msg);
            System.out.println("接收的原始消息:");
           msg.writeTo(System.out);
        WSHelper.decrypt(doc, keyStoreFile, keyStoreType,
                            keyStorePassword, keyAlias, keyEntryPassword);//解密

            WSHelper.verify(doc, trustStoreFile, trustStoreType, trustStorePassword);//验证
            WSHelper.removeWSSElements(doc);
            msg = MessageConverter.convertDocumentToSOAPMessage(doc);
            System.out.println("怀原后的原始消息:");
            msg.writeTo(System.out);
            messageContext.setMessage(msg);
    } catch (Exception e){
            e.printStackTrace();
            System.err.println("在处理响应时发生以下错误: " + e);
                         }

        }
}   
     
     WSServerResponseHandler.java
     public class WSServerResponseHandler extends WSServerHandler{
  public void invoke(MessageContext messageContext) throws AxisFault {
    try {

     SOAPMessage soapMessage = messageContext.getMessage();
       System.out.println("返回的原始消息:");
         soapMessage.writeTo(System.out);
      Document doc = MessageConverter.convertSoapMessageToDocument(soapMessage);

        WSHelper.sign(doc, keyStoreFile, keyStoreType,
          keyStorePassword, keyAlias, keyEntryPassword);//数字签名
       WSHelper.encrypt(doc, trustStoreFile, trustStoreType,//加密
        trustStorePassword, certAlias);

       soapMessage = MessageConverter.convertDocumentToSOAPMessage(doc);
       System.out.println("返回的加密后的消息:");
       soapMessage.writeTo(System.out);
       messageContext.setMessage(soapMessage);
        } catch (Exception e){
        System.err.println("在处理响应时发生以下错误: " + e);
         e.printStackTrace();
         }

        }
}

6、应用
   为方便使用,把上述文件打包为ws-axis.jar,放入%TOMCAT_HOME%/webapps/axis/WEB-INF/lib
   
   1)把HelloWorld重新部署一次,在server-config.wsdd中修改如下部署代码。
       <service name="HelloWorld" provider="java:RPC">
         <parameter name="allowedMethods" value="*"/>
         <parameter name="className" value="HelloWorld"/>
         <requestFlow>
           <handler type="soapmonitor"/>
           <handler type="java:com.ronghao.WSAxis.WSServerRequestHandler">
              <parameter name="keyStoreFile" value="f:/server.keystore"/>
              <parameter name="trustStoreFile" value="f:/server.truststore"/>
              <parameter name="keyStorePassword" value="changeit"/>
              <parameter name="keyAlias" value="Server"/>
              <parameter name="keyEntryPassword" value="changeit"/>
              <parameter name="trustStorePassword" value="changeit"/>
              <parameter name="certAlias" value="clientkey"/>
           </handler>
        </requestFlow>
        <responseFlow>
           <handler type="soapmonitor"/>
           <handler type="java:com.ronghao.WSAxis.WSServerResponseHandler">
              <parameter name="keyStoreFile" value="f:/server.keystore"/>
              <parameter name="trustStoreFile"  value="f:/server.truststore"/>
              <parameter name="keyStorePassword" value="changeit"/>
              <parameter name="keyAlias" value="Server"/>
              <parameter name="keyEntryPassword" value="changeit"/>
              <parameter name="trustStorePassword" value="changeit"/>
              <parameter name="certAlias" value="clientkey"/>
           </handler>
        </responseFlow>
     </service>
     
    2)修改客户端程序 TestClient.java(修改的部分已标出,记着导入ws-axis.jar)
    import javax.xml.namespace.QName;
    import org.apache.axis.client.Call;
    import org.apache.axis.client.Service;
    import com.ronghao.WSAxis.*;
    
    public class WSSClient1
{
    public static void main(String [] args)
    {
        try {
                //服务端的url,需要根据情况更改。
            String endpointURL = "http://localhost:8080/axis/services/HelloWorld";
            Service svc = new Service();

            WSClientHandler handler=new WSClientRequestHandler();
//注意新加的HANDLER
            handler.setInitialization("f:/client.keystore","changeit","Client","changeit",
                "f:/client.truststore","changeit","serverkey");//初始化
            WSClientHandler handlee=new WSClientResponseHandler();
//注意新加的HANDLER
            handlee.setInitialization("f:/client.keystore","changeit","Client","changeit",
                "f:/client.truststore","changeit","serverkey");//初始化
                     Call call =(Call)svc.createCall();
                     call.setClientHandlers(handler,handlee);//添加Handler
                     call.setTargetEndpointAddress(new java.net.URL(endpointURL));
                     call.setOperationName(new QName("sayHello"));

                     String result = (String) call.invoke( new Object [] {});
                     System.out.println("the result"+result);

        } catch (Exception e) {
                e.printStackTrace();
        }
    }


}
   运行的时候http://localhost:8080/axis/SOAPMonitor中看到的请求的XML就已加密!
   
总结
   这里对代码的解释是不够的,很多概念没有提到。建议你最好看tsik.jar和AXIS的API深入了解。另外对ws-axis.jar的加解密实现打算运用apache的wss4j,相关网址http://ws.apache.org/ws-fx/wss4j/。不过这个东西也应该够用了暂时。所有的源文件在附件中附件:soapTest.zip(279K) 

选自:http://bound.blogdriver.com/bound/1120157.html

axis实现webservice发布服务 使用axis发布webservice服务,客户端 服务端均有 本地测试通过。 立即下载

相关推荐

Canoe CAPL TCP通信避坑指南:从OnTcpConnect回调不触发到Socket句柄管理

本文详细解析了Canoe CAPL中TCP通信的常见问题与解决方案,包括OnTcpConnect回调不触发的三大原因、Socket句柄管理的内存泄漏风险、数据发送截断规则等。通过实战案例和代码示例,帮助开发者规避TCP通信中的典型陷阱,提升车载网络测试的稳定性和可靠性。

weixin_26976635的博客 358

使用axis发布服务

axis是Apache的一个Web Service的发布平台,它提供了两种web service 的发布方式: 1、即时发布JWS: 1、编写普通的无包结构的java文件,主要是类--方法; 2、修改编写好的java文件的后缀名为jws; 3、发布web service服务,这个主要是将编写好的jws文件放到axis项目平台中,并根据放入的文件目录来确定服务访问的地址; 4、编写客户端来

wujiang88的博客 700

从零构建OpenBMC风扇控制:基于phosphor-pid-control的实战配置指南

本文详细介绍了如何从零开始构建OpenBMC风扇控制系统,基于phosphor-pid-control框架实现风扇自动调速。通过解析PID算法配置、传感器定义及控制区域设置,提供工业级散热解决方案,帮助开发者优化服务器能效与可靠性。

weixin_29263201的博客 749

AXIS服务间传递JavaBean及其安全解决

 在AXIS服务间传递JavaBean及其安全解决 这是AXIS学习笔记的最后一篇。在前面我们讨论了最简单的HelloWorld服务,客户端并没有向服务器端 传递参数,现在我们来传传JavaBean。当然,也可以传递你自己定义的JAVA类,但那样你必须自己创建 专门的XML序列化器和反序列化器;而对JavaBean,AXIS提供了现成的序列化器。(有人说:懒惰是程序员最大的美德,我喜欢,所以我就传

chengbd的专栏 1569

SAP SD RRB实战:从DIP参数文件到DP90/DP91开票的完整链路解析

本文详细解析了SAP SD模块中RRB(Resource-related Billing)业务场景的完整链路,从DIP参数文件配置到DP90/DP91开票操作。通过实战案例分享DIP参数文件的核心配置技巧、特性设置及物料决定要点,帮助用户掌握动态开票的关键技术,提升SAP SD RRB的实施效率。

weixin_26833939的博客 378

AutoSAR系列讲解 - 前言

博主xyfx是一名汽车行业的嵌入式软件工程师,本职工作是同步电机的驱动控制(主要做FOC的,这个大家要是有兴趣,以后可以单独开一个专栏来讲解一下),由于做控制器的时候需要用到AutoSAR,所以特意的去学习了相关知识,同时博主自己也在同步提高中,有写的不合理的地方也请大家指正。我准备对AutoSAR开设两个大的方面来讲解,一是AutoSAR的入门篇,二是AutoSAR的实践篇,分别讲述AutoSAR的理论基础和工具的使用。

雪云飞星的博客 4万+

AXIS第四课:AXIS高级应用,建立安全的AXIS服务

根据应用的对安全要求的级别不同,可以采用不同的方式来实现安全性,以下是目前最常用的一些实现方式(从低到高排列): 1、J2EE Web应用默认的访问控制(数据是明文的); 2、使用axis的Handler进行访问控制(数据是明文的); 3、使用Servlet过滤器(Filter)进行访问...

439

RT-DETR改进目录一览 | 涉及卷积层、轻量化、注意力、损失函数、Backbone、SPPF、Neck、检测头等全方位改进

1️⃣本专栏已更新260多种不同的改进方法,所使用并改进的每一个模块均包含详细的模块分析、原理讲解、个人总结、多种改进方式以及完整的修改流程,所有改进100%可直接运行。2️⃣所有改进点均为近三年顶会,顶刊提出的先进算法,将其融入到中,紧跟学术热点,适应不同的任务场景。3️⃣团队内发表数篇SCI论文,熟悉完整的发表流程,订阅专栏即可进群享受模型训练、模型改进、论文写作、投稿选刊,从入门到论文的各种答疑内容。4️⃣专栏内容会持续更新,最近更新时间:2024-12-4。项目介绍在大家购买专栏后,加入学习

Limiiiing的博客 2万+

Java WebService学习笔记 - Axis进阶(二)

上一篇 Java WebService学习笔记 - Axis(一) 前一篇博文中简单介绍了Axis的使用方法,这篇将介绍一些Axis的一些高级特性 Axis中Handler的使用 Handler的作用和Struts中Filter类似,主要用于访问之前或之后做一些特别的处理。主要包括权限验证,授权,访问量统计等等。 下面一个简单的例子介绍一下具体的使用方法 访问量...

weixin_30772105的博客 182

KEPServerEX 6 之 lot Gateway MQTT Clinet 配置使用方式

IoT Gateway即Internet of Things Gateway物联网网关。 ---------------------------------------------------------------------------------- 方式:使用kepw的IOTGateway插件选择MQTTClient 解决:可以实现 KEPW 的Tag值 发送到 MQTT 服务器上 ----------------------------------------...

-雲飛兄-博客 6942

语音识别:PyAudio、SoundDevice、Vosk、openai-whisper、Argos-Translate、FunASR(Python)

本文介绍了Python中常用的音频处理库PyAudio,详细解析了其核心功能、核心概念和典型工作流程。PyAudio是一个跨平台的音频I/O库,支持音频录制、播放、实时流处理和低延迟操作。核心概念包括PyAudio类(管理音频设备和流)和Stream类(代表音频流)。文章重点讲解了open()方法的关键参数、回调函数的使用方式以及典型的工作流程,包括设备查询、流配置和资源释放。PyAudio适用于需要实时音频处理的场景,如语音识别和音频效果处理。

算法工程师 706

建立安全的AXIS服务(上)

建立安全的AXIS服务(上)

走向资深架构师的旅程 783

玩转Docker | 使用Docker部署MediaCMS内容管理系统

玩转Docker | 使用Docker部署MediaCMS内容管理系统

qq_59334230的博客 2918

建立安全的AXIS服务(下)

四、使用WS-Security规范对信息进行加密与身份认证    我们打算用Handler结合WSSecurity实现Web服务安全    设想流程:用WSClientRequestHandler.java位于客户端对客户端发出的XML文档进行加密  WSServerRequestHandler.java位于服务器端对客户端发出的加密后的XML文档进行解密WSServerResponseHan...

zgc168的博客 199

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

使用SSL/HTTPS协议来建立安全的AXIS服务传输

使用SSL/HTTPS协议来建立安全的AXIS服务传输 文章目录 1、使用JDK自带的工具创建密匙库和信任库。2、更改Tomcat的配置文件(server.xml),增加以下部署描述符:(其实里面有,只是被注释掉了)3、修改客户端程序 TestClient.java(修改的部分已标出)  使用SSL/HTTPS协议来传输 Web服务也可以使用SSL作为传输协议。虽然JAX-

xiaoqi270620903的专栏 741

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

WS安全性问题(2)

 建立安全的AXIS服务在前面的文章中,我们实现了最简单的AXIS服务。现在我们一起来讨论一下Web服务的安全问题。根据应用的对安全要求的级别不同,可以采用不同的方式来实现安全性,以下是目前最常用的一些实现方式(从低到高排列):    1、J2EE Web应用默认的访问控制(数据是明文的);     2、使用axis的Handler进行访问控制(数据是明文的);     3、使用Servlet过滤

autoair的专栏 1655

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

Axis的Web服务开发 --- 相关资料摘录

出处:http://www.blogjava.net/ronghao 荣浩原创 http://www.blogjava.net/RongHao/archive/2007/06/12/123633.html 建立安全的AXIS服务http://www.blogjava.net/RongHao/archive/2007/06/12/123635.htmlhttp://www.b

【昆山人在上海】 545

AXIS完全总结

AXIS完全总结关键词: AXIS        目录1.发布web服务2.发布Web服务使用Handler来增强Web服务的功能3.建立安全的AXIS服务(上)4.建立安全的AXIS服务(下)5.在AXIS服务间传递JavaBean及其安全解决                           AXIS学习笔记(一) ronghao100 原创  前

为了你 3630

通向架构师的道路(第十四天)Axis2 Web Service安全之rampart

一、加密保护我们的web service传输 在上一天的教程中,我们讲了一个简单的基于” security-constraint”的以指定用户名和密码来保护一个Web Service以及如何用https对这个web service的通讯过程进行保护。虽然它用https来进行保护了,但是我们抛开https,这个web service之间传输的用户名,密码,数据都是明文的。 在我之间教程中曾经提到

鹏鹏博客 1229
上一篇: 使用Handler来增强Web服务的功能
下一篇: AXIS发布WebService
艾沙可牛
博客等级 码龄20年 54粉丝 31原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值