wss4j和axis2实现WSSecurity.docx
- 文档编号:6303835
- 上传时间:2023-01-05
- 格式:DOCX
- 页数:13
- 大小:88.23KB
wss4j和axis2实现WSSecurity.docx
《wss4j和axis2实现WSSecurity.docx》由会员分享,可在线阅读,更多相关《wss4j和axis2实现WSSecurity.docx(13页珍藏版)》请在冰豆网上搜索。
wss4j和axis2实现WSSecurity
一、wss4j简介
Wss4j是apache开发的,标准实现WS-Security(WebService安全)的开源项目,它提供了用户名令牌环验证(UsernameToken)和传递消息时保证信息的完整性和真实性等一些WebService安全保障。
二、环境准备
2.1开发环境准备
在正式开始前还要去下载一个rampart-1.1.mar,下载地址
这个东东是在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作为服务器端
该类的内容是:
packagecom.neusoft.wss4j.rempart.demo.services;
publicclassSimpleService
{
publicStringecho(Stringarg)
{
returnarg;
}
}
这个类的作用就是接收客户端的字符串,并且把该字符串返回给客户端。
这里还有个类,该类是实现UsernameToken和传送信息的安全性和完整性的核心,该类被配置在axis2.xml和service.xml中,从而能得到用户配置的axis2.xml中的信息,和服务器端配置的service.xml的信息。
每当客户端发送请求时,它都要首先通过该类获得访问服务端的权限和获得发送数据所需要的加密密码,然后把数据加密发送给服务器端,如果没有权限则不能把数据发送到服务器端,每当服务器端想要把数据传送到客户端时,也要经过次类获得发送数据所需要的加密密码,然后把数据加密返回给客户端,客户端通过解密获得明文信息。
它的内容如下:
packagecom.neusoft.wss4j.rempart.demo.services;
importorg.apache.ws.security.WSPasswordCallback;
importjavax.security.auth.callback.Callback;
importjavax.security.auth.callback.CallbackHandler;
importjavax.security.auth.callback.UnsupportedCallbackException;
importjava.io.IOException;
publicclassPWCBHandlerimplementsCallbackHandler
{
publicvoidhandle(Callback[]callbacks)throwsIOException,
UnsupportedCallbackException
{
for(inti=0;i { WSPasswordCallbackpwcb=(WSPasswordCallback)callbacks[i]; Stringid=pwcb.getIdentifer(); if("client".equals(id)) { pwcb.setPassword("apache"); } elseif("service".equals(id)) { pwcb.setPassword("apache"); } else { thrownewUnsupportedCallbackException(callbacks[i], "对不起,您不是授权用户,不能访问该WEB服务! "); } } } } 4.2编写服务器端的描述文件services.xml 然后写一个解析该服务器类services.xml文件该文件的内容如下: xmlversion="1.0"encoding="UTF-8"? > class="org.apache.axis2.rpc.receivers.RPCMessageReceiver"/> com.neusoft.wss4j.rempart.demo.services.SimpleService keys/service.properties com.neusoft.wss4j.rempart.demo.services.PWCBHandler keys/service.properties DirectReference 服务器wsc中有几个方法就需要配置几个 echo为wsc服务器类中的方法。 wsc为服务的名字也就是后边的打包服务器端wsc.aar的名字。 着重看下红色和粉色字体部分,红色这部分是客户端传来信息用数字签名来解密客户端传过来的加密信息本例通过keys文件夹下的service.properties这个文件找到service.jks对信息进行解密,粉色部分是服务器端把输出向客户端的信息加密用的,本例通过keys文件夹下的service.properties这个文件找到service.jks对信息加密的。 service.properties的内容如下: org.apache.ws.security.crypto.provider=ponents.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.aarcopy到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 它的内容如下: packagecom.neusoft.wss4j.rempart.demo.client; importjava.io.Reader; importjava.io.StringReader; importorg.apache.axiom.om.OMAbstractFactory; importorg.apache.axiom.om.OMElement; importorg.apache.axiom.om.OMFactory; importorg.apache.axiom.om.OMNamespace; importorg.apache.axis2.addressing.EndpointReference; importorg.apache.axis2.client.Options; importorg.apache.axis2.client.ServiceClient; importorg.apache.axis2.context.ConfigurationContext; importorg.apache.axis2.context.ConfigurationContextFactory; importorg.jdom.Document; importorg.jdom.Element; importorg.jdom.input.SAXBuilder; publicclassClient { publicstaticvoidmain(String[]args)throwsException { ConfigurationContextctx=ConfigurationContextFactory .createConfigurationContextFromFileSystem( "D: /eclipse3.2/workspace/wsc/WebRoot/WEB-INF","D: /eclipse3.2/workspace/wsc/WebRoot/WEB-INF/conf/axis2.xml"); ServiceClientclient=newServiceClient(ctx,null); Optionsoptions=newOptions(); options.setAction("urn: echo"); options.setTo(newEndpointReference( "http: //localhost: 8080/wsc/services/wsc")); client.setOptions(options); OMElementresponse=client.sendReceive(getPayload("(*^__^*)嘻嘻……")); OMElementelement=response.getFirstElement(); //把返回的OMElement对象转换为xml数据 SAXBuilderbuilder=newSAXBuilder(); Readerin=newStringReader(element.toString()); Documentdoc=null; try { doc=builder.build(in); ElementElement=doc.getRootElement(); Stringaa=Element.getTextTrim(); System.out.println(aa); } catch(Exceptione) { System.out.println(e.getMessage()); } } privatestaticOMElementgetPayload(Stringvalue) { OMFactoryfactory=OMAbstractFactory.getOMFactory(); OMNamespacens=factory.createOMNamespace( " OMElementelem=factory.createOMElement("echo",ns); OMElementchildElem=factory.createOMElement("param0",null); childElem.setText(value); elem.addChild(childElem); returnelem; } } 这个测试类就不多说了,粉色的部分是需要注意的地方。 还有个客户端的axis2.xml需要说明一下 他的内容如下: xmlversion="1.0"encoding="UTF-8"? > //www.w3.org/2004/08/wsdl/in-only"class="org.apache.axis2.receivers.RawXMLINOnlyMessageReceiver"/> //www.w3.org/2004/08/wsdl/in-out"class="org.apache.axis2.receivers.RawXMLINOutMessageReceiver"/> class="org.apache.axis2.transport.tcp.TCPServer"> class="org.apache.axis2.transport.jms.JMSSender"/> --Systempre-definedphases-->
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- wss4j axis2 实现 WSSecurity