`
mizhao1984
  • 浏览: 91700 次
  • 性别: Icon_minigender_1
  • 来自: 西安
社区版块
存档分类
最新评论

axis高级应用监理安全的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="" target="_blank">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界面,在
eclipse中运行我们上次写的客户端程序 TestClient.java。OK!你会在Applet界面看
见客户端与服务器端互发的XML内容,注意这里是明文!

二、使用axis的Handler进行访问控制(对安全要求不高时推荐)
axis为Web服务的访问控制提供了相关的配置描述符,并且提供了一个访问控制的简单 Handler。默认情况下,你只要在配置描述符中添加用户,然后在Web服务器的部署描述符中自动允许的角色即可。

1、在axis的配置文件users.lst(位于WEB-INF目录下)中添加一个用户,如"annlee 1111",表示
用户名为annlee,密码为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="annlee"/>   //注意,这里是新加的部分!
<parameter name="className" value="HelloWorld"/>
</service>
在这个部署描述符中,指定HelloWorld服务只能被annlee访问

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("annlee");// 用户名。
    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.annlee.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.annlee.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.annlee.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/。不过这个东西也应该够用了暂时

分享到:
评论

相关推荐

    Webservice之Axis高级编程

    5. **AXIS第五课:AXIS高级应用,在AXIS服务间传递JavaBean及其安全解决** 除了基本的XML数据交换,Axis也支持Java对象(JavaBean)的传递。这简化了数据结构的复杂性,但同时也引入了潜在的安全问题。本课将讲解...

    axis2教程 axis2应用方法

    - **编写Axis2模块(Module)**:允许开发者扩展Axis2的功能,例如添加日志记录、安全验证等功能模块。 - **使用soapmonitor模块监视SOAP请求与响应消息**:提供了一个监控工具,帮助开发者调试服务交互过程中的问题。...

    一种基于Axis2的SOAP安全传输模型的研究

    总之,基于Axis2的SOAP安全传输模型为Web服务提供了一种有效的消息级安全解决方案。通过集成Rampart组件,不仅增强了Web服务的安全性,而且简化了安全特性的开发和部署过程。未来的研究还可以进一步探索如何优化性能...

    axis1.3官网web应用

    标签“axis web应用”进一步强调了这是关于使用Axis进行Web服务开发的内容。Axis不仅仅是一个库,它还包括一套完整的工具,用于生成、发布和调试Web服务。它支持WSDL(Web服务描述语言)和UDDI(统一描述、发现和...

    axis2服务包

    "axis2war"是Axis2服务包的一种特定部署形式,它是将Axis2服务打包成WAR(Web Application Archive)文件,便于在任何支持Java的Web服务器或应用服务器上运行。 WAR文件是Java Web应用程序的标准打包格式,包含了...

    Axis高级编程

    通过以上六个方面的详细讲解,我们可以全面地理解Axis高级编程的知识点,包括Web服务的基础知识、发布方法、高级特性如Handler的使用、安全性的构建以及监控工具的应用。这些内容不仅有助于深入掌握Axis的技术细节,...

    axis2客户端调用axis1服务接口

    axis2客户端调用axis1服务接口 调用方式 使用RPC方式调用WebService,为了防止冲突可以增加 // 与weblogic的lib冲突配置 System.setProperty("javax.xml.stream.XMLInputFactory", ...

    axis2发布webservice和调用axis2服务接口

    在IT行业中,Axis2是Apache软件基金会开发的一个用于构建Web服务和Web服务客户端的框架,主要基于Java语言。本文将详细讲解如何使用Axis2来发布Web服务以及如何生成客户端代码来调用这些服务。 首先,让我们了解...

    axis2 axis webservice web 服务

    7. **安全性**:Axis2集成了多种安全机制,如Transport Layer Security (TLS)、WS-Security、WS-SecureConversation等,确保Web服务的安全性。 8. **易于部署**:Axis2的部署模型非常直观,可以通过简单的XML配置...

    Axis_API和axis2_API

    在IT行业中,Web服务是应用程序之间进行通信的一种标准方法,而Axis和Axis2是两种流行的Java SOAP(简单对象访问协议)框架,用于构建和消费Web服务。本文将深入探讨这两个API,以及它们在Web服务开发中的作用。 ...

    webservice axis1.4服务实例

    Web服务(Web Service)是一种基于网络的、分布式的模块化组件,它提供了标准的方法来让不同的应用程序在Internet上相互通信。Axis1.4是Apache Axis的一个版本,它是一个流行的开源工具,用于实现和部署Java Web服务...

    Axis发布调用服务

    Apache Axis是一个开源的Java库,遵循SOAP规范,使Java应用服务器具备提供Web服务的能力。 **一、Web服务简介** Web服务是一种通过标准化接口(WSDL,Web Services Description Language)来暴露和调用功能的技术。...

    axis1.4和axis2相关jar文件

    在Java世界中,Apache Axis是用于构建Web服务和客户端应用程序的工具包,它允许开发者将Java类暴露为Web服务,并且能够消费其他Web服务。Axis分为两个主要版本:Axis1和Axis2,这两个版本在功能、性能和设计上都有所...

    axis 1.x与axis2.x开发

    Axis1.x是较早的版本,它在Web服务领域有着广泛的应用。Axis1.x基于Servlet API,提供了SOAP消息处理和WSDL(Web Services Description Language)生成的功能。它的优点在于简单易用,对于初学者来说,快速搭建Web...

    axis2的API,axis2 API,axis2帮助文档

    本文将详细介绍Axis2的API及其在Web服务开发中的应用,同时也会探讨Axis2的帮助文档如何协助开发者更好地理解和使用这个框架。 ### Axis2简介 Axis2是Apache Axis的第二代版本,它在第一代的基础上进行了许多改进和...

    axis2-1.5.1-bin.zip axis2-1.5.1-war.zip axis2部署使用

    标签中的“axis2-1.5.1-bin.zip”和“axis2-1.5.1-war.zip”表明这两个包都是针对Axis2 1.5.1版本的,这个版本可能包含了特定的安全修复、性能优化或其他功能改进。 总结来说,Apache Axis2是强大的Web服务框架,...

    myService_purpose1sv_cxf调用axis2的接口服务_接口服务_

    Apache CXF和Axis2都是流行的开放源码服务框架,它们各自在Web服务领域有着广泛的应用。 Apache CXF是一个强大的服务框架,它允许开发人员创建和消费各种类型的Web服务,包括SOAP、RESTful等。CXF集成了多种协议和...

    Axis1,Axis2,Xfire,CXF区别

    Axis1, Axis2, Xfire, CXF 是四种常用的WebService框架,它们之间有着不同的特点和应用场景。本文将对这四种框架进行详细的比较和分析,以帮助开发者选择合适的框架。 XFire 是一种新一代的 WebService 平台,它...

    Axis实践之Axis入门

    【Axis实践之Axis入门】 Axis是一个流行的开源SOAP(Simple Object Access ...继续深入学习,你将掌握更多关于Web服务开发的专业知识,如WSDL、SOAP消息结构、服务安全以及与其他技术(如JAX-RPC、JAX-WS)的集成等。

Global site tag (gtag.js) - Google Analytics