最近公司要把web services传输内容全加密用到wss4j,于是上网看了篇帖子照着做没有跑通,于是做了下修改,如下:
一、wss4j简介
Wss4j是apache开发的,标准实现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.jks和client.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,o=qinan,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.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);","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的公钥
解密服务器端返回来的信息。
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/youanyyou/archive/2010/06/03/5645343.aspx
分享到:
相关推荐
**标签“wss4j和axis2”关联知识点** - **Apache Axis2**:Axis2是Apache软件基金会的一个开放源代码Web服务引擎,它提供了一种基于SOAP的消息传递模型。Axis2与WSS4J结合,可以提供端到端的Web服务安全解决方案。 ...
4. **wss4j-bindings.jar**:包含了与不同Web服务框架(如CXF、Axis2等)的绑定和集成代码。 5. **wss4j-policy.jar**:提供了对WS-Policy和WS-SecurityPolicy的支持,帮助开发者定义和验证服务的安全策略。 6. 可能...
而`wss4j`(Web Services Security for Java)是Apache软件基金会开发的一个开源项目,它是对`ws-security`概念的具体实现。`wss4j`提供了丰富的API,用于在SOAP消息上执行各种WS-Security操作,包括但不限于: 1. ...
3. **如何使用WSS4J加密和签名SOAP消息**:WSS4J(Web Services Security for Java)是Apache的一个子项目,专门用于提供Web服务的安全功能。本书详细讲解了如何利用WSS4J来实现SOAP消息的加密和签名,从而保障数据...
2. **WSS4J(Web Services Security for Java)**:Apache Axis2通常使用WSS4J库来处理WS-Security相关的操作,包括头鉴权。 3. **用户名令牌(Username Token Profile)**:这是WS-Security中的一种常见认证方式,...
- **感谢对象**:作者特别感谢了Apache Axis开发团队、WSS4J开发团队以及Web服务领域的专家Anne Thomas Manes等人的贡献和支持。 通过上述总结,我们可以看出《使用Apache Axis2开发Web服务》这本书是一本非常实用...
`build.xml`可能是Ant构建脚本,`src`和`bin`目录包含源代码和编译后的类,`.settings`目录存储Eclipse项目特定的设置,而`lib`目录则可能包含所需的依赖库,比如Axis2库和其他安全相关的库,例如WSS4J。 在实际...
4. **整合过程**:在Axis1.4中实现Wrapped样式加密和签名,开发者需要配置WSS4J(Web Services Security for Java)库,该库提供了在SOAP消息上添加安全头的功能。这包括设置加密和签名的策略,如使用的算法、密钥...
- **安全机制**:探讨如何使用WSS4J库加密和签名SOAP消息,以提高Web服务的安全性。 - **硬核安装**:提供一系列最佳实践和技术,帮助开发者加强Apache Axis的安装安全性。 #### 四、本书的独特内容 - **如何使用...
- **加密和签名**:使用WSS4J库来加密和签名SOAP消息,确保数据在传输过程中的安全。 - **强化部署**:采取措施来防止未经授权的访问,例如设置访问控制列表。 - **输入验证**:确保所有接收到的数据都是合法的,...
2. **创建安全上下文**:为了实现身份验证,你需要创建一个`WSS4JOutInterceptor`,并提供安全相关的配置,比如使用`UsernameToken`进行基本认证。这可以通过`WSSecurityProperties`类来完成。 3. **添加拦截器**:...
3. wss4j-1.5.1.jar:Web Services Security for Java (WSS4J) 是一个处理Web服务安全的库,如SOAP消息签名和加密,确保数据传输的安全性。 4. log4j-1.2.8.jar:Apache Log4j是一个流行的日志记录框架,用于在开发...
在"Server"部分的源码中,可能会看到实现这些安全特性的代码,如使用X.509证书进行SSL/TLS握手,或者使用WSS4J库实现WS-Security头的添加和验证。"Client"则可能包含相应的调用和服务请求,同时处理服务器返回的加密...
Rampart模块基于WSS4J(Web Services Security for Java)库,该库提供了实施WS-Security规范的各种工具。在源码中,我们可以看到Rampart如何创建和管理加密密钥,以及如何在SOAP消息中插入加密元素。开发者可以通过...
- **服务器端实现**:首先,定义服务接口和实现类,然后使用XFire或Axis工具发布为Web服务。发布时,需要指定服务的URI和WSDL文件位置。 - **客户端实现**:获取服务器发布的WSDL文件,使用XFire或Axis提供的工具...
1. **添加 Rampart 库**:确保 Axis2 的 classpath 中包含了 Rampart 的所有依赖库,包括 Rampart 模块本身和相关安全库,如 WSS4J。 2. **启用 Rampart 模块**:在 `axis2.xml` 文件中,将 Rampart 模块添加到已...
WSS4J是WS-Security标准的实现,提供了安全的Web服务通信,支持加密和数字签名等功能。 #### 13. Apache WSRF WSRF实现了Web Services Resource Framework标准,提供了一种管理Web服务资源的机制,增强了服务的管理...
5. **wss4j-1.5.1.jar**:Web Services Security for Java,提供安全相关的支持,如数字签名和加密,确保Web服务的安全通信。 6. **wstx-asl-3.2.0.jar**:Woodstox,一个高效的XML流解析器和生成器,用于处理XML...