Wss4j的学习----这是我第一次写东西。因为,我实在是发现了分享知识的重要性。因为现在的学习基本都是靠百度,google了。呵呵。进入正题。
简单说明:wss4j是,axis的实现WS-Wecurity安全机制的一个框架。
具备知识:java和axis知识。
运行环境:至少可以跑起来一个axis的程序。哪怕是一个helloworld。
必须的包:wss4j.jar官方地址:
http://ws.apache.org/wss4j/。
工作原理:我用一张图来说明一切,你会明白的。
![](https://p-blog.csdn.net/images/p_blog_csdn_net/wowoer/wss4j%E5%AE%9E%E7%8E%B0%E5%8E%9F%E7%90%86%E6%B5%81%E7%A8%8B%E5%9B%BE.jpg)
是不是非常明白?
为了方便学习,我下载的是wss4j-bin-1.5.3.zip这个版本,因为里面有自带的几个例子。我来叫你跑起这些例子便于学习。
一步一步教你跑起这些例子:
1. 解压wss4j-bin-1.5.3.zip到wss4j文件夹。看到
![](https://p-blog.csdn.net/images/p_blog_csdn_net/wowoer/wss4j.bmp)
一个比较简单的例子在samples里,复杂一点的例子在interop里。我们先来进行简单的例子。
2. 在eclipse里建个新的项目,我这里叫做“testwss4j”,建包,和类和官方文件夹相同:
![](https://p-blog.csdn.net/images/p_blog_csdn_net/wowoer/%E4%BE%8B%E5%AD%90%E6%96%87%E4%BB%B6.bmp)
主要的文件说明:
org.apache.axis.samples.wssec.doall.axisSec包:
是目标服务器端程序。是org.apache.axis.samples.wssec.doall包里的sec.wsdl文件生成(生成方法见axis学习文档)的。
org.apache.axis.samples.wssec.doall包:
PWCallback.java文件是,headler对xml文件进行签名,加密,解密的类。
Tester.java是客户端测试类。
Client_deploy.wsdd文件是,客户端签名,加密的配置文件。
3. 主要类说明
除了PWCallback.java是wss4j.jar中的应用,其他类均为axis的应用。不做过多说明。
PWCallback.java
说明:
![](https://p-blog.csdn.net/images/p_blog_csdn_net/wowoer/pwcallback.bmp)
41到46行的说明是指,这里是给已经加入了user或者keystore alias的soap消息加入或者密码。可以是identifier的形式也可以是直接设置密码。由于是例子,这里是最简单的给一个user加入一个最简单的密码。
4. 运行例子
运行例子之前会发现项目会有很多错误,用你习惯的方式导入项目testwss4j所需要的包。包括axis的所有包和wss4j.jar。我的包的列表:
![](https://p-blog.csdn.net/images/p_blog_csdn_net/wowoer/jar.bmp)
如果没有错误,首先启动服务器,发布目标服务器程序。如果一切顺利
可以run as java application
à org.apache.axis.samples.wssec.doallTester.java。
会得到如下结果:
![](https://p-blog.csdn.net/images/p_blog_csdn_net/wowoer/result.bmp)
如果你在PWCallback.java加入断点就会发现,根本没有调用加密程序。不过得到结果至少知道这个程序是畅通的。下面我们开始加密。
没有加密的config-deploy.wsdd的配置文件中SecHttp的服务配置为:
![](https://p-blog.csdn.net/images/p_blog_csdn_net/wowoer/config.bmp)
加入加密配置文件之后为:
![](https://p-blog.csdn.net/images/p_blog_csdn_net/wowoer/wss-config.bmp)
注意红色框的位置为加密的配置。说明,目标服务器端接收的soap消息必须是加密的。重启服务器,允许Tester.java就会发现报错:
![](https://p-blog.csdn.net/images/p_blog_csdn_net/wowoer/error.bmp)
说明你的配置完全正确,因为请求没有加密所以报错。修改Tester.java:
![](https://p-blog.csdn.net/images/p_blog_csdn_net/wowoer/test.bmp)
红色框中为修改的部分。注意client_deploy.wsdd的地址位置要用“//”分割。重启服务器,运行Tester.java就会得到刚刚的结果了。如果加入断点就会进入方法。
5.复杂例子。
在interop文件夹下:
![](https://p-blog.csdn.net/images/p_blog_csdn_net/wowoer/interop.bmp)
ping.wsdl是服务器接口描述文件。org文件下包括服务器接口的测试类。也包括服务器接口,但是,直接在eclipse里打开会有很多错误,我因为懒得改正错误,所以用ping.wsdl从新生成了服务器端接口,在axis的学习里就有。但是生成之后就会发现一个问题,本身服务器接口的包是org.apache.ws.axis.oasis.ping,服务器接口的类在这个包下,如果用文件夹里的ping.wsdl生成的包为org.xmlsoap .Ping,所以服务器接口都在这个包下。直接放在项目里就会发现很多关于包的错误。为了和原始包保持一直的思想,修改ping.wsdl,生成包org.apache.ws.axis.oasis.ping。修改了三个地方:
第5行:xmlns:tns=
http://xmlsoap.org/Ping修改为xmlns:tns=
http://oasis.axis.ws.apache.org/ping
第9行:targetNamespace=
http://xmlsoap.org/Ping 修改为:targetNamespace="
http://oasis.axis.ws.apache.org/ping"
第12行:<s:schema elementFormDefault="qualified" targetNamespace="http://xmlsoap.org/Ping">修改为<s:schema elementFormDefault="qualified" targetNamespace="
http://oasis.axis.ws.apache.org/ping">
其他地方没有做改动
。覆盖原来的服务器接口。项目中的包都按照
org.apache.ws.axis.oasis.ping这个包的形式修改。导入项目后如图:
![](https://p-blog.csdn.net/images/p_blog_csdn_net/wowoer/projectinterop.bmp)
发布服务器端接口,等工作不再缀述。
这个项目给了页面测试,现在把页面也导入到项目里。按照原有文件夹的形式,在项目下新建文件夹webapps导入文件如图:
![](https://p-blog.csdn.net/images/p_blog_csdn_net/wowoer/webapps.bmp)
页面interop.jsp是项目ping的测试页面。如果测试通过页面如下:
![](https://p-blog.csdn.net/images/p_blog_csdn_net/wowoer/interopjsp.bmp)
我的本地测试端口为7070。Tomcat默认是8080。7个按钮,7个不同等级的安全身份验证。第1个和上面简单的例子是一样。我只介绍一个稍微复杂的第3个端口。发生请求和返回请求都加入身份验证,并且是jks证书验证。wss4j2.jsp页面需要修改,原始文件没有加入wss4j验证,包的引入也需要修改。修改部分如下:
![](https://p-blog.csdn.net/images/p_blog_csdn_net/wowoer/wss4j2.bmp)
其他部分没有修改。
由于只测试接口3,服务名为Ping3,为服务器端加入wss4j验证,修改服务器端配置文件(server-congig.wsdd)为:
![](https://p-blog.csdn.net/images/p_blog_csdn_net/wowoer/wss-config_ping3.bmp)
红色框:
为服务器端解密并验证签名。验证签名的配置文件为test.properties(官方给出配置文件为wsstest.proterties)。这个文件默认放在classes文件夹下才可以找到(应该可以修改位置)。验证签名的类为:org.apache.ws.axis.oasis.PWCallback1。如何验证见这个类。
黄色框:
为服务器端返回客户端时候对消息的签名配置。配置文件和接收请求的相同。因为是服务器端向客户端请求,所以请求用户名为“server”,接收端用户名为“client”。最后一行属性为,签名加密的算法。
修改客户端配置文(
Client_deploy.wsdd
)为:
![](https://p-blog.csdn.net/images/p_blog_csdn_net/wowoer/client_deploy_ping3.bmp)
红色框:
为向服务器端签名加密申请,申请用户名为client,接收服务器为server。和服务器端请求返回基本相同。
黄色框:
和服务器端接收请求基本相同。
在客户端也放上配置文件,test.properties(官方给出配置文件为wsstest.proterties)。如果没有问题,可以启动服务器,运行程序。
选择interop3的按钮。会发现出现错误:
WSHandler:Encryption: error during message
processingorg.apache.ws.security.WSSecurityException
: An unsupported signature or encryption algorithm was used (unsupported key transport encryption algorithm: No such algorithm: http://www.w3.org/2001/04/xmlenc#rsa-1_5)
。
查了资料发现需要一个包:
bcprov-jdk15-138.jar
。为什么需要,我没有研究,但是加入之后就没有错误了。可以顺利通过,结果为:
![](https://p-blog.csdn.net/images/p_blog_csdn_net/wowoer/jksresult.bmp)
Interop2.jks是用keytool工具生成的,我会另做说明。
Wss4j
的应用就是这样。