axis2和wss4j实现webservices加密

最近公司要把web services传输内容全加密用到wss4j,于是上网看了篇帖子照着做没有跑通,于是做了下修改,如下:

一、wss4j简介

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

二、环境准备

2.1开发环境准备

在正式开始前还要去apche网站下载一个rampart-1.5.mar

把这个小编放到WEB-INF/modules下去
这个小编是在AXIS2上实现WSS4J必需要的一个组件。把wss4j的相关jar包导到lib下。

三、用KEYTOOL生成一对JKS文件

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

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

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

 

生成方法如下:

C:/Documents and Settings/Administrator>keytool -genkey -keyalg RSA -keysize 512
 -dname "cn=service,o=qinan,c=cn" -alias service -keypass administrator -keystor
e d:/keystore/service.jks -storepass qinanehome

C:/Documents and Settings/Administrator>keytool -genkey -keyalg RSA -keysize 512
 -dname "cn=client,c=cn" -alias client -keypass administrator -keystore
d:/keystore/client.jks -storepass qinanadminehome

 

 

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.xmlservice.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>

echowsc服务器类中的方法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  copyD:/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);","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文件的密码给用户clientclient通过密码在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的公钥

解密服务器端返回来的信息。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


1.使用ajax调用varxhr;functioninvoke(){if(window.ActiveXObject){xhr=newActiveXObject("Microsoft.XMLHTTP");}else{xhr=newXMLHttpRequest();}//指定请求地址varurl="http://127.0.0.1:7777/hello?wsdl";//
               好不容易把WebService服务器端搭建起来,我们还需要客户端程序也同样跑起来才能够进行和服务器端程序的通信: 在这篇文章里面,我会先自己写代码去实现调用WebService服务器端程序,接下来,通过IDEA配置的方式来调用WebService服务端: 首先,我写了一个W
1新建一个工程项目用来做服务端增加一个MyService1类文件packagecom.zns.ws;importjavax.jws.WebMethod;importjavax.jws.WebService;importjavax.xml.ws.Endpoint;@WebServicepublicclassMyService1{publicstaticvoidmain(String[]args){
packagecom.transsion.util;importjava.io.BufferedReader;importjava.io.IOException;importjava.io.InputStreamReader;importjava.io.PrintWriter;importjava.net.URL;importjava.net.URLConnection;importcom.alibaba.druid.util.Base64;importcom.tra
再生产wsdl文件时重写描述文件1usingSystem;2usingSystem.Collections.Generic;3usingSystem.Linq;4usingSystem.Web;5usingSystem.Web.Services.Description;67namespaceStrongSoftManage.Web.App8{9publicclassSoapExtens:SoapExtensi
一般情况下,使用eclipse自带的jax-ws生成webservice会自动生成2个类:ContractConnector.java packagecom.wonders.webservice.contract;importjava.text.DecimalFormat;importjava.text.ParseException;importjava.text.SimpleDateFormat;importjava.util.Date;i
一、WebService概述1.1什么是WebService 基于Web的服务:服务器端整出一些资源让客户端应用访问(获取数据) 一个跨语言、跨平台的规范(抽象)所谓跨编程语言和跨操作平台,就是说服务端程序采用java编写,客户端程序则可以采用其他编程语言编写,反之亦然!跨操作系统平台则是指服务
一、什么是CXF?    ApacheCXF=Celtix+Xfire,开始叫ApacheCeltiXfire,后来更名为ApacheCXF了,以下简称为CXF。ApacheCXF是一个开源的webServices框架,CXF帮助您构建和开发webServices,它支持多种协议,比如:SOAP1.1,1,2 XML/HTTP、RESTful或者CORBA。  
工具IDEA一、构建项目1、选择SpringInitializr2、填写项目信息3、勾选webService4、勾选Thymeleaf5、项目建立完成,启动类自动生成二、写个Controller启动服务。浏览器访问/hello接口。 
1.环境win764位,vs20102.新建一个asp.netweb应用程序(同上一篇)3.添加一个web引用,引用上一篇创建的服务。注意不是服务引用。如下图 
WebService之WSDL文件讲解   恩,我想说的是,是不是经常有人在开发的时候,特别是和第三方有接口的时候,走的是SOAP协议,然后用户给你一个WSDL文件,说按照上面的进行适配,嘿嘿,这个时候,要是你以前没有开发过,肯定会傻眼,那如果你想学习的话,就认真的看下面的讲解咯:一、WSDL概述  
在websrvice发布文件的webconfig中加入<httpRuntimemaxRequestLength="102400"/> <webServices>     <protocols>       <addname="HttpPost"/>       <addname="HttpGet"/>     </protocols>   
 代码比较简单,按照如下来操作即可,只是jar包有很多问题,比如找不到classnotFondspring、以及找不到xfile.xml、以及xfile.xml中的一个参数问题,以及2.0 spring。jar和spring1.6.2冲突问题,总之这个小demo报了一堆错误,其实都是jar的问题,为了让大家减少这方面的错误,所以我提供
 一、soapUI简介SOAP:   WebService通过Http协议发送请求和接收结果时,发送的请求内容和结果内容都采用XML格式封装,并增加了一些特定的HTTP消息头,以说明HTTP消息头的内容格式,这些特定的HTTP消息头和XML内容格式就是SOAP协议。SOAP提供了标准的RPC方法来调用WebService。 
参考,感谢https://blog.csdn.net/hj7jay/article/details/727224381.环境:win764位,jdk1.8.0_201 EclipseJavaEEIDEforWebDevelopers.Version:Mars.1Release(4.5.1)2.创建一个普通的java项目,名字是TheService在src目录下创建一个com.hyan.service包,在此包下创建
CXF实现RestfulWebService基础示例一、写在前面IDE:IDEA14JDK:1.7CXF:2.6.2示例来源:%CXF_HOME%\samples\jax_rs\basic发布方式:JAXRSServerFactoryBean的create()方法调用方式:URL的openStream()方法、HttpClient的executeMethod()方法二、服务端(Java项目)1.准备Jar包
封装helper类:classWebServiceHelper{///<summary>///1.get请求http方法///</summary>///<paramname="url">基础url</param>///<paramname="method">请求方法</param>///<paramnam
.net客户端调用java或.netwebservice进行soapheader验证最近项目中有业务需要跨平台调用web服务,客户端和服务器之间采用非对称加密来保证数据的安全性,webservice的安全验证基于soapheader。借此机会,顺便整理一下调用.netwebservice和javawebservice的验证方式,记录下来。
Node.jshttps://www.cnblogs.com/goldlong/p/8027997.htmlQQ音乐apihttps://juejin.im/post/5a35228e51882506a463b172#heading-11?tdsourcetag=s_pcqq_aiomsgGit把本地仓库上传到GitHbubhttps://blog.csdn.net/zamamiro/article/details/70172900git删除本地仓库https://blog.cs
转载自:孤傲苍狼 WebService学习总结(三)——使用JDK开发WebService一、WebService的开发手段使用Java开发WebService时可以使用以下两种开发手段1、 使用JDK开发(1.6及以上版本)-->详见:本文2、使用CXF框架开发-->详见:其他文章二、使用JDK开发WebServi