`
wanghuanqiu
  • 浏览: 110036 次
  • 性别: Icon_minigender_1
  • 来自: 沈阳
社区版块
存档分类
最新评论

axis加密

阅读更多
转自[url]http://hi.baidu.com/zhaopengletter/blog/item/a85945915dcf378ba877a448.html
[/url]
一、 wss4j 简介

Wss4j 是 apache 开发的,标准实现 WS-Security (WebService 安全 ) 的开源项目,它提供了用户名令牌环验证 (UsernameToken) 和传递消息时保证信息的完整性和真实性等一些 WebService 安全保障。
二、环境准备

2.1 开发环境准备

在正式开始前还要去下载一个 rampart-1.1.mar ,下载地址 http://apache.hoxt.com/ws/rampart/1_1/ 。把这个东东放到 WEB-INF\modules 下去
这个东东是在 AXIS2 上实现 WSS4J 必需要的一个组件。把 wss4j 的相关 jar 包导到 lib 下。
三、用 KEYTOOL 生成一对 JKS 文件

首先我们用 keytool 生成一对 JKS 文件, service.jks 和 client.jks 。
service.jks 存放了 service 的私钥和 client 的公钥。
client.jks 存放了 client 的私钥和 service 的公钥。
本人生成的

service.jks 的私钥和公钥 keystore 的密码是 apache
client.jks 的私钥和公钥 keystore 的密码是 apache ,

( 注如果不会用 keytool 请自己看相关资料,我用的是 apache 提供 sample 的文件 )

2.2 搭建 webservice 环境

将 axis2.war 包拷贝到 tomcat 安装目录下的 webapps 目录下。

启动 Tomcat(D:\Tomcat5.5\bin\startup.bat) ,打开浏览器输入并访问 :http://127.0.0.1:8080/axis2 来查看 , 结果如下图,表示 axis2 已经工作正常。

四、建立 web 应用

4.1 编写服务器端代码

首先简单介绍我的 Wss4j 实现 WS-Security 功能 , 很简单就是客户端发送一个字符串,服务器端得到该字符串,同时把字符串在发送给客户端, 首先自己建立一个 web 应用工程 , 这里就以我的 wsc 应用工程为例

在 src 下建一个包 com.neusoft.wss4j.rempart.demo.services 在这里写一个类 SimpleService 作为服务器端

该类的内容是:

package com.neusoft.wss4j.rempart.demo.services;

public class SimpleService

{

     public String echo(String arg)

     {

         return arg;

     }

}

这个类的作用就是接收客户端的字符串,并且把该字符串返回给客户端。

这里还有个类,该类是实现 UsernameToken 和传送信息的安全性和完整性的核心,该类被配置在 axis2.xml 和 service.xml 中,从而能得到用户配置的 axis2.xml 中的信息,和服务器端配置的 service.xml 的信息。每当客户端发送请求时,它都要首先通过该类获得访问服务端的权限和获得发送数据所需要的加密密码,然后把数据加密发送给服务器端,如果没有权限则不能把数据发送到服务器端,每当服务器端想要把数据传送到客户端时,也要经过次类获得发送数据所需要的加密密码,然后把数据加密返回给客户端,客户端通过解密获得明文信息。它的内容如下:

package com.neusoft.wss4j.rempart.demo.services;

import org.apache.ws.security.WSPasswordCallback;

import javax.security.auth.callback.Callback;

import javax.security.auth.callback.CallbackHandler;

import javax.security.auth.callback.UnsupportedCallbackException;

import java.io.IOException;

public class PWCBHandler implements CallbackHandler

{

     public void handle(Callback[] callbacks) throws IOException,

             UnsupportedCallbackException

             {

                        for (int i = 0; i < callbacks.length; i++)

                        {

                            WSPasswordCallback pwcb = (WSPasswordCallback)callbacks[i];

                           

                            String id = pwcb.getIdentifer();

                            if("client".equals(id))

                            {

                                pwcb.setPassword("apache");

                            }

                            else if("service".equals(id))

                            {

                                pwcb.setPassword("apache");

                            }

                     else

                     {

                         throw new UnsupportedCallbackException(callbacks[i],

                          " 对不起,您不是授权用户,不能访问该 WEB 服务! ");

                     }

                        }

           }

}



4.2 编写服务器端的描述文件 services.xml

然后写一个解析该服务器类 services.xml 文件该文件的内容如下:

<? xml version = "1.0" encoding = "UTF-8" ?>

< service name = "wsc" >

     < operation name = "echo" >

        < messageReceiver

          class = "org.apache.axis2.rpc.receivers.RPCMessageReceiver" />

     </ operation >

     < parameter name = "ServiceClass" locked = "false" >

        com.neusoft.wss4j.rempart.demo.services.SimpleService

     </ parameter >

     < module ref = "rampart" />

     <parameter name="InflowSecurity">

        <action>

            <items>Timestamp Signature</items>

            <signaturePropFile>

               keys/service.properties

            </signaturePropFile>

        </action>

     </parameter>

     <parameter name="OutflowSecurity">

        <action>

            <items>Timestamp Signature</items>

            <user>service</user>

             <passwordCallbackClass>

               com.neusoft.wss4j.rempart.demo.services.PWCBHandler

            </passwordCallbackClass>

            <signaturePropFile>

               keys/service.properties

            </signaturePropFile>

            <signatureKeyIdentifier>

               DirectReference

            </signatureKeyIdentifier>

        </action>

     </parameter>

</ service >



服务器 wsc 中有几个方法就需要配置几个 < operation ></ operation >

echo 为 wsc 服务器类中的方法 。 wsc 为服务的名字也就是后边的打包服务器端 wsc .aar 的名字 。着重看下红色 和粉色 字体部分,红色 这部分是客户端传来信息用数字签名来解密客户端传过来的加密信息本例通过 keys 文件夹下的 service.properties 这个文件找到 service.jks 对信息进行解密,粉色 部分是服务器端把输出向客户端的信息加密用的,本例通过 keys 文件夹下的 service.properties 这个文件找到 service.jks 对信息加密的。

service.properties 的内容如下:

org.apache.ws.security.crypto.provider = org.apache.ws.security.components.crypto.Merlin

org.apache.ws.security.crypto.merlin.keystore.type = jks

org.apache.ws.security.crypto.merlin.keystore.password = apache

org.apache.ws.security.crypto.merlin.file = keys/service.jks

写明了加密文件的类型,文件密码,文件名称。
4.3   生成 .aar 服务包

下边就可以根据一个服务器类 SimpleService 一个 service.xml 打包生成一个 wsc.aar 做为服务器端的程序 。 首先将这个 SimpleService 类打包 , 然后把 service.xml 放在打包后的 MATE-INFO 下边

这样服务器端程序 wsc.aar 就完成了 。 下边把 wsc.aar   copy 到 D:\program\Tomcat6.0\webapps\axis2\WEB-INF\services 目录下 ( 这里是以我的机器做为例子的 )

然后重启 tomcat 输入 http://127.0.0.1:8080/axis2/services/listServices

就可以看到我们部署到服务器上的服务了。

4.4   编写模拟第三方测试程序

下面我写一个模拟第三方的程序调用 webservice 的一个例子

在包 com.neusoft.wss4j.rempart.demo.client 中的 Client

它的内容如下 :

package com.neusoft.wss4j.rempart.demo.client;

import java.io.Reader;

import java.io.StringReader;

import org.apache.axiom.om.OMAbstractFactory;

import org.apache.axiom.om.OMElement;

import org.apache.axiom.om.OMFactory;

import org.apache.axiom.om.OMNamespace;

import org.apache.axis2.addressing.EndpointReference;

import org.apache.axis2.client.Options;

import org.apache.axis2.client.ServiceClient;

import org.apache.axis2.context.ConfigurationContext;

import org.apache.axis2.context.ConfigurationContextFactory;

import org.jdom.Document;

import org.jdom.Element;

import org.jdom.input.SAXBuilder;

public class Client

{

     public static void main(String[] args) throws Exception

     {

         ConfigurationContext ctx = ConfigurationContextFactory

                 .createConfigurationContextFromFileSystem(

                         "D:/eclipse3.2/workspace/wsc/WebRoot/WEB-INF",             "D:/eclipse3.2/workspace/wsc/WebRoot/WEB-INF/conf/axis2.xml" );

         ServiceClient client = new ServiceClient(ctx, null);

         Options options = new Options();

         options.setAction(" urn:echo ");

         options.setTo(new EndpointReference(

                 " http://localhost:8080/wsc/services/wsc "));

          client.setOptions(options);

         OMElement response = client.sendReceive(getPayload(" (*^__^*) 嘻嘻…… " ));

         OMElement element = response.getFirstElement();

         // 把返回的 OMElement 对象转换为 xml 数据

         SAXBuilder builder = new SAXBuilder();

         Reader in = new StringReader(element.toString());

         Document doc = null;

         try

         {

             doc = builder.build(in);

             Element Element = doc.getRootElement();

             String aa = Element.getTextTrim();

             System.out.println(aa);

          }

         catch (Exception e)

         {

             System.out.println(e.getMessage());

         }

     }

     private static OMElement getPayload(String value)

     {

         OMFactory factory = OMAbstractFactory.getOMFactory();

         OMNamespace ns = factory.createOMNamespace(

         " http://services.demo.rempart.wss4j.neusoft.com/xsd ","ns1");

         OMElement elem = factory.createOMElement(" echo ", ns);

         OMElement childElem = factory.createOMElement("param0", null);

         childElem.setText(value);

          elem.addChild(childElem);

         return elem;

     }

}

这个测试类就不多说了, 粉色 的部分是需要注意的地方。

还有个客户端的 axis2.xml 需要说明一下

他的主要内容如下只要把这部分粘贴到原来的axis2.xml即可 :

<module ref="rampart" />

<parameter name="OutflowSecurity">
       <action>
         <items>Timestamp Signature</items>
         <user>client</user>
         <signaturePropFile>keys/client.properties</signaturePropFile>
         <passwordCallbackClass>com.neusoft.wss4j.rempart.demo.services.PWCBHandler</passwordCallbackClass>
         <signatureKeyIdentifier>DirectReference</signatureKeyIdentifier>
       </action>
     </parameter>

     <parameter name="InflowSecurity">
       <action>
         <items>Timestamp Signature</items>
         <signaturePropFile>keys/client.properties</signaturePropFile>
       </action>
     </parameter>

注意一下 红色 的部分他是当客户端向服务器端发送数据时,首先访问 com.neusoft.wss4j.rempart.demo.services.PWCBHandler 这个类,得到访问权限和加密信息的文件密码,然后通过加密信息的文件密码和 keys/client.properties 文件找到加密需要的文件 client.jks 把信息加密发送给服务器端, 粉色 部分是通过 keys/client.properties 文件找到解密需要的文件 client.jks 来解密服务器端返回的加密信息。

Keys 文件下的 client.properties 内容如下:

org.apache.ws.security.crypto.provider = org.apache.ws.security.components.crypto.Merlin

org.apache.ws.security.crypto.merlin.keystore.type = jks

org.apache.ws.security.crypto.merlin.keystore.password = apache

org.apache.ws.security.crypto.merlin.file = keys/client.jks



五、总    结

整理一下思路

1 客户端发送消息给服务器端 : 如果客户端想请求服务器端首先读取客户端配置文件 axis2.xml 文件,得到访问的用户 <user>client</user> 然后找到 com.neusoft.wss4j.rempart.demo.services.PWCBHandler 类,看用户是否有访问服务的权限,如果有则把 client.jks 文件的密码给用户 client , client 通过密码在 axis2.xml 文件中找到 <signaturePropFile>keys/client.properties</signaturePropFile> 找到 client.properties 文件,在 client.properties 文件中找到 client.jks 文件,使用该文件的 client 私钥 从而实现把传送的信息加密,然后把加密的信息发送到服务器端。

2 服务器端接收客户端发送来的消息 : 服务器端接收到消息,然后读取 service.xml 文件找到 <signaturePropFile>keys/service.properties</signaturePropFile> 从而找到 service.properties 文件,通过该文件找到 service.jks 文件使用该文件的 client 的公钥

解密客户端传送来的信息。

3 服务器端返回信息给客户端 : 获得客户端传送过来的明文信息后,从 service.xml 文件

得到加密的用户 <user>service</user> 通过

<passwordCallbackClass>

com.neusoft.wss4j.rempart.demo.services.PWCBHandler

</passwordCallbackClass>

找到验证类 PWCBHandler 得到加密需要的 service.jks 的加密密码 apache

通过 <signaturePropFile>

     keys/service.properties

     </signaturePropFile> 找到 service.properties 文件,通过该文件找到 service.jks 文件,通过该文件的 service 的私钥 把需要发送给客户端的信息加密。然后发送给客户端

4 客户端接收服务器端返回的消息 : 客户端端接收到消息,然后读取 axis2.xml 文件找到 <signaturePropFile>keys/service.properties</signaturePropFile> 从而找到 client.properties 文件,通过该文件找到 client.jks 文件使用该文件的 service 的公钥

解密服务器端返回来的信息。
分享到:
评论

相关推荐

    WebService详细解析(axis,xfire,cxf,授权认证加密解密)

    本篇文章详细介绍了WebService的基本概念和AXIS、XFire、CXF这三个流行的Java WebService框架,以及授权认证和加密解密在WebService中的应用。这些内容对于理解和实践WebService开发具有重要价值,为开发者提供了...

    Axis2.jar包

    10. **安全性** - Axis2还支持安全特性,如WS-Security,可以实现对Web服务的安全认证和加密。 综上所述,Axis2.jar包及其相关的jar文件是Java环境中构建和使用Web服务的关键组件,它为开发者提供了高效、灵活的...

    axis2-1.5.6完整版

    3. **安全特性**:Axis2 支持各种安全机制,如 SOAP 消息安全、SSL/TLS 加密,这对于处理 SAP 中敏感数据的 Web Service 接口至关重要。 在提供的压缩包中,我们可以看到以下几个重要组成部分: - **axis2-1.5.6-...

    springboot+axis1.4

    7. **安全考虑**:在生产环境中,你可能还需要考虑Web服务的安全性,如身份验证、授权和加密。Spring Boot提供了与Spring Security的集成,可以用来保护你的Web服务。 8. **性能优化**:随着服务的使用,可能需要...

    axis2-1.6.4源码

    8. **WS-Security(Web Services Security)**:Axis2 提供对WS-Security标准的支持,包括消息认证、加密和签名。研究源码有助于理解如何实现安全的Web服务。 9. **互操作性(Interoperability)**:Axis2 作为SOAP...

    axis2+spring webservice

    7. **安全考虑**:讨论如何配置Spring和Axis2以实现安全的Web服务,包括WS-Security标准的实现,如数字签名和加密。 8. **性能优化**:学习如何调整Axis2和Spring的配置以提高Web服务的性能,例如缓存策略、线程池...

    axis及其关联包

    5. **WS-Security支持**: Axis还支持WS-Security标准,确保Web服务的安全性,如身份验证、加密和消息完整性。 ### 关联包 - **Axis2**: 是Axis的下一代版本,它引入了模块化设计,提供了更高的性能和可扩展性。Axis...

    axis1.4 + wrapped + encrypt + signature

    本文将深入探讨基于Axis1.4的Wrapped样式加密与签名技术,这对于理解如何确保Web服务的安全性至关重要。 Wrapped样式在Web服务安全中指的是一个特殊的SOAP消息封装模式,其中请求或响应的业务数据被加密并/或签名。...

    Axis2例子Demo

    3. **安全**:Axis2支持WS-Security标准,提供消息级安全特性,如数字签名和加密。 **六、示例学习价值** 通过这个Axis2例子Demo,你可以学习到: 1. 如何创建一个基本的Axis2服务。 2. 如何编写服务端和客户端代码...

    web service axis 1.6

    - **消息级安全性**:Axis 1.6支持WS-Security,可以对消息进行签名和加密。 - **消息交换模式**:包括请求-响应、单向、回调等模式,适应不同应用场景。 - **WS-I Basic Profile兼容**:确保服务符合Web服务互...

    axis1.4帮助文档

    11. **安全**:虽然Axis1.4本身不包含高级的安全特性,但它可以与其他安全框架(如Spring Security或WS-Security)集成,以实现身份验证、授权和消息加密。 12. **调试与日志**:Axis1.4提供了丰富的日志记录和调试...

    axis2文档.

    6. **WS-Security**:Axis2支持Web服务安全标准,如WS-Security,可以实现身份验证、加密、数字签名等功能,确保Web服务的安全性。 7. **代码生成**:Axis2提供了代码生成工具,可以从WSDL文件生成Java服务接口和...

    axis1.7.7最少jar

    5. **WS-Security**:如果需要安全的Web服务,需要理解WS-Security标准,以及如何配置和使用数字签名和加密。 6. **异常处理**:了解Axis1中可能出现的常见错误和异常,以及如何调试和解决这些问题。 7. **部署和...

    axis2-1.6zip

    - **安全特性**:支持WS-Security等安全标准,可以实现消息签名、加密以及基于角色的访问控制。 - **缓存和性能优化**:Axis2内置了消息缓存机制,可以提高服务响应速度和整体性能。 - **国际化和本地化**:支持多种...

    axis2-1.7.4完整资源包.zip

    - **安全机制**:内置了对WS-Security的支持,包括消息认证、加密和签名,保障Web服务的安全性。 - **事件驱动架构**:基于Axis2的事件模型,服务处理可以更加灵活和高效。 在使用Axis2调用Web服务时,你需要: 1....

    springboot使用axis1.4的demo

    7. **安全考虑**:在生产环境中,需要考虑安全性问题,例如使用SSL/TLS加密通信,限制对Web服务的访问权限,以及应用认证和授权机制。 总结起来,将Spring Boot与Axis1.4结合使用,可以方便地在Spring Boot应用中...

    axis2-1.7.5-bin.zip

    9. **WS-Security**:Axis2包含了对WS-Security的支持,提供了身份验证、消息完整性、加密等功能,确保Web服务的安全通信。 10. **性能优化**:Axis2允许配置多个线程池和缓存策略,以适应高并发场景,提高服务响应...

    axis2 -1.6.2 api 文档

    7. **安全特性**:Axis2集成了一些安全标准,如WS-Security、WS-Trust和WS-SecureConversation,提供身份验证、消息加密和完整性检查等功能。 8. **传输协议**:Axis2不仅支持HTTP和HTTPS,还可以通过SMTP、JMS等...

    axis2_source

    Axis2支持WS-Security标准,源码中可以研究安全策略的实现,如数字签名、加密等。 8. **部署和生命周期管理**: Axis2服务的部署、启动、停止等生命周期管理在源码中有详细的实现,这对于理解服务的动态管理和...

    axis入门中文文档

    在使用Axis开发Web服务时,还需要考虑安全性问题,如身份验证、授权和加密。此外,可以通过调整Axis配置、缓存策略等方式优化服务性能。 九、故障排查与调试 在开发过程中,可能会遇到各种错误和异常,如网络问题、...

Global site tag (gtag.js) - Google Analytics