`
zhushidan100
  • 浏览: 30259 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

CXF WS-SECURITY协议对soap消息加密

 
阅读更多

<!-- 服务端代码: -->
<jaxws:endpoint id="userWebService" implementor="#userServiceImpl" 
		address="/userservice">
		<jaxws:inInterceptors>
			<bean class="org.apache.cxf.interceptor.LoggingInInterceptor"></bean>
			<bean class="org.apache.cxf.binding.soap.saaj.SAAJOutInterceptor" /> 
			<bean class="org.apache.cxf.ws.security.wss4j.WSS4JInInterceptor" >
				<constructor-arg>
					<map>
						<entry key="action" value="UsernameToken Timestamp" />
						<!-- MD5加密明文密码 -->
                        <entry key="passwordType" value="PasswordDigest" />    
                        <entry key="user" value="admin" />
                        <entry key="passwordCallbackRef" >
                       		<ref bean="serverPasswordCallback" />    
                        </entry>   
					</map>
				</constructor-arg>
			</bean>
		</jaxws:inInterceptors>
		<jaxws:outInterceptors>
			<bean class="org.apache.cxf.interceptor.LoggingOutInterceptor"></bean>
		</jaxws:outInterceptors>
	</jaxws:endpoint>
	<bean id="serverPasswordCallback" class="com.cxf.webservice.callback.ServerPasswordCallback"></bean>

 com.cxf.webservice.callback.ServerPasswordCallback:

package com.cxf.webservice.callback;

import java.io.IOException;
import java.util.HashMap;
import java.util.Map;

import javax.security.auth.callback.Callback;
import javax.security.auth.callback.CallbackHandler;
import javax.security.auth.callback.UnsupportedCallbackException;

import org.apache.log4j.Logger;
import org.apache.ws.security.WSPasswordCallback;

public class ServerPasswordCallback implements CallbackHandler {
	Logger log = Logger.getLogger(ServerPasswordCallback.class);
	
	Map<String, String> user = new HashMap<String, String>();
	{
		user.put("admin", "1234");
		user.put("su", "1234");
	}
	
	@Override
	public void handle(Callback[] callbacks) throws IOException,
			UnsupportedCallbackException {
		log.debug("handler passwordcallback method....");
		WSPasswordCallback wpc = (WSPasswordCallback) callbacks[0];
		if (!user.containsKey(wpc.getIdentifier())) {
			throw new SecurityException("No Permission!");
		}
		/*
		 * 此处特别注意::
		 * WSPasswordCallback 的passwordType属性和password 属性都为null,
		 * 你只能获得用户名(identifier),
		 * 一般这里的逻辑是使用这个用户名到数据库中查询其密码,
		 * 然后再设置到password 属性,WSS4J 会自动比较客户端传来的值和你设置的这个值。
		 * 你可能会问为什么这里CXF 不把客户端提交的密码传入让我们在ServerPasswordCallbackHandler 中比较呢?
		 * 这是因为客户端提交过来的密码在SOAP 消息中已经被加密为MD5 的字符串,
		 * 如果我们要在回调方法中作比较,那么第一步要做的就是把服务端准备好的密码加密为MD5 字符串,
		 * 由于MD5 算法参数不同结果也会有差别,另外,这样的工作CXF 替我们完成不是更简单吗?
		 */
		wpc.setPassword(user.get(wpc.getIdentifier()));//如果包含用户名,就设置该用户名正确密码,由CXF验证密码
		String username = wpc.getIdentifier();
		String password = wpc.getPassword();
		log.debug("username: "+username + "    password: "+password);
		log.info("User : "+wpc.getIdentifier()+ "  login!!!!!");
	}

}

 

 

 

 

<!--客户端配置-->
<bean id="userService" class="webservice.cxf.client.UserService" factory-bean="clientFactory" factory-method="create" />
	<bean id="clientFactory" class="org.apache.cxf.jaxws.JaxWsProxyFactoryBean">
		<property name="address" value="http://127.0.0.1:8080/HSQLDB/webservice/userservice"></property>
		<property name="serviceClass" value="webservice.cxf.client.UserService"></property>
		<property name="outInterceptors">
			<list>
				<bean class="org.apache.cxf.interceptor.LoggingOutInterceptor" />
				<bean class="org.apache.cxf.binding.soap.saaj.SAAJOutInterceptor" />
				<bean class="org.apache.cxf.ws.security.wss4j.WSS4JOutInterceptor">
					<constructor-arg>
						<map>
							<entry key="action" value="UsernameToken Timestamp" />
							<!-- MD5加密明文密码 -->
							<entry key="passwordType" value="PasswordDigest" />
							<entry key="user" value="admin" />
							<entry key="passwordCallbackRef">
								<ref bean="clientPasswordCallback" />
							</entry>
						</map>
					</constructor-arg>
				</bean>
			</list>
		</property>
	</bean>
	<bean id="clientPasswordCallback" class="webservice.cxf.clientPasswordCalback.ClientPasswordCallback"></bean>

 webservice.cxf.clientPasswordCalback.ClientPasswordCallback:

package webservice.cxf.clientPasswordCalback;

import java.io.IOException;

import javax.security.auth.callback.Callback;
import javax.security.auth.callback.CallbackHandler;
import javax.security.auth.callback.UnsupportedCallbackException;

import org.apache.ws.security.WSPasswordCallback;

public class ClientPasswordCallback implements CallbackHandler {

	@Override
	public void handle(Callback[] callbacks) throws IOException,
			UnsupportedCallbackException {
		for (Callback callback : callbacks) {
			//设置用户密码,供服务端验证
			WSPasswordCallback wsc = (WSPasswordCallback)callback;
			wsc.setIdentifier("su");
			wsc.setPassword("1234");
		}
	}

}

 Tset:

ApplicationContext app ;
	
	@Before
	public void initAPP(){
		app = new ClassPathXmlApplicationContext("cxf-client.xml");
	}
	
	@Test
	public void testSucruty(){
		UserService us = (UserService) app.getBean("userService");
		System.out.println(us.getAllUser().size());
	}
 
分享到:
评论
4 楼 chyzh2010 2013-12-06  
我现在用cxf-2.7.5进行测试,已通过明文密码验证了,但是但我测试密码验证不通过时,客户端和服务端并没有抛异常,只是在服务端的控制台打印异常出来。另外客户端的请求信息和返回信息都在客户端控制台打印了。请问验证不通过时如何告知客户端?客户端的请求信息和返回信息如何获取?谢谢....
3 楼 hash 2013-03-16  
/*
         * 此处特别注意::
         * WSPasswordCallback 的passwordType属性和password 属性都为null,
         * 你只能获得用户名(identifier),
         * 一般这里的逻辑是使用这个用户名到数据库中查询其密码,
         * 然后再设置到password 属性,WSS4J 会自动比较客户端传来的值和你设置的这个值。
         * 你可能会问为什么这里CXF 不把客户端提交的密码传入让我们在ServerPasswordCallbackHandler 中比较呢?
         * 这是因为客户端提交过来的密码在SOAP 消息中已经被加密为MD5 的字符串,
         * 如果我们要在回调方法中作比较,那么第一步要做的就是把服务端准备好的密码加密为MD5 字符串,
         * 由于MD5 算法参数不同结果也会有差别,另外,这样的工作CXF 替我们完成不是更简单吗?
         */ 


以上文字帮了我大忙...谢啦
2 楼 clean1981 2012-09-11  
请教, 节点<entry key="user" value="admin" />起的什么作用?设置默认用户名?可以不用吗? 
1 楼 dannielhome 2012-07-24  
这样,异构系统怎么接入进来调用呢?

相关推荐

    CXF(WS_Security)证书加密

    证书加密是WS-Security中的一个重要组成部分,它通常使用X.509数字证书来验证服务提供者和服务消费者的标识,并对消息进行加密。X.509证书包含公钥和私钥,公钥用于加密数据,私钥用于解密数据。在CXF中,我们可以...

    CXF WS-Security WSS4J 例子

    CXF(CXF: Composite Application ...在实际应用中,根据业务需求选择合适的WS-Security策略,如使用数字签名确保消息完整性,使用加密保护敏感数据,以及通过各种令牌进行身份验证,可以有效提升Web服务的安全性。

    ws-security 和wss4j的jar包

    也可以对消息进行加密,防止敏感数据在传输过程中被窃取。同时,WSS4J还支持多种安全令牌,如X.509证书、用户名令牌、SAML令牌等,以满足不同场景下的安全需求。 总之,WS-Security和WSS4J是Java环境中保障Web服务...

    cxf+ws-security-JAR

    2. ws-security:这是OASIS制定的Web服务安全标准,用于在SOAP消息层面提供安全功能,如数字签名、加密、身份验证等。 3. webservice:Web服务是一种通过网络进行通信的应用程序接口,允许不同系统间的互操作性。 4....

    ws-security jar

    在Java中,通常使用Apache CXF、Axis2等Web服务框架,它们内置了对WS-Security的支持。 使用"ws-security jar"时,开发者可以配置Web服务客户端和服务器端的策略,设置签名和加密算法,指定认证方式,以及处理证书...

    WS-Security构筑安全的SOAP消息调用

    WS-Security规范为Web服务的安全性提供了一个强大的框架,它不仅解决了传统安全机制的局限性,还通过消息完整性和加密等功能确保了SOAP消息的安全传递。此外,通过采用诸如时间戳、序列号和挑战-响应机制等策略,WS-...

    ws-security三个jar包

    ISNetworksProvider.jar可能是某个特定厂商提供的WS-Security实现或者一个特定的安全提供者,可能包含了对WS-Security规范的某些特定功能的支持,例如证书管理或特定加密算法的实现。 tsik.jar文件名暗示了它可能是...

    Web 服务规范_第 4 部分:WS-Security源码

    数字签名基于非对称加密技术,发送方使用私钥对消息哈希进行签名,接收方使用公钥验证签名。 3. **消息保密性**:使用加密技术保护消息内容,防止在传输过程中被窃听。通常使用XML Encryption标准来实现。 4. **...

    ws-security java-mail

    在SOAP消息中,`ws-security` 可以添加数字签名、加密、时间戳等元素,确保数据在传输过程中的安全。例如,`ws-security` 可以通过X.509证书进行公钥基础设施(PKI)的认证,也可以使用UsernameToken或 Kerberos ...

    CXF开发所需jar包

    对于需要安全性的Web服务,如WS-Security,CXF提供了相应的jar包,如`cxf-rt-ws-security.jar`,包含了加密、签名、认证等安全功能。 6. **数据绑定和对象映射**: CXF支持多种数据绑定技术,如JAXB(Java ...

    apache-cxf-2.6.1-src

    7. **安全机制**:CXF提供安全特性,包括基于证书的SSL/TLS加密、WS-Security标准实现,支持基本认证、digest认证、OAuth等。 在"apache-cxf-2.6.1-src"中,开发者可以找到以下文件和目录: - **cxf**: 这是CXF的...

    cxf-2.7.18

    CXF允许开发者创建和消费各种Web服务,支持多种协议和规范,如SOAP、RESTful HTTP、WS-*(如WS-Security)等。 CXF的主要特点和功能包括: 1. **服务实现与调用**:CXF提供了两种方式来实现Web服务,即JAX-WS...

    cxf 3.1.1 jar包

    8. **cxf-rt-ws-security.jar**: 包含了WS-Security和其他安全相关的实现,用于Web服务的安全认证和加密。 9. **cxf-tools-common.jar** 和 **cxf-tools-wsdlto-core.jar** 等工具类库,用于生成服务端和客户端代码...

    soap内容加密(助记)

    7. **工具支持**:在实际开发中,许多开发工具和框架如Apache CXF、Spring WS等提供了WS-Security的支持,帮助开发者轻松实现SOAP消息的加密和签名。 8. **源码实践**:理解上述概念后,开发者需要编写代码来实现...

    apache-cxf-2.7.6.rar

    4. **安全特性**:CXF内置了对WS-Security(Web Services Security)的支持,包括消息认证、加密和数字签名等,确保Web服务的安全通信。 5. **工具集**:CXF提供了一套强大的工具,如wsdl2java用于从WSDL生成Java...

    apache-cxf-3.2.1-src.tar.gz

    5. **WS-Security**:通过CXF,你可以实现Web服务的安全性,包括数字签名、加密和身份验证,符合WS-Security标准。 6. **Transport and Bindings**:CXF支持多种传输方式,如HTTP、HTTPS、JMS等,以及多种绑定机制...

    CXF SOAP应用实例

    例如,可以使用WS-Security来实现SOAP消息的加密和签名,确保通信安全。 7. **CXF与Spring集成** CXF可以很好地与Spring框架集成,通过Spring配置文件管理服务和客户端。这样可以方便地实现依赖注入,提高代码的可...

    apache-cxf-3.0.5

    2. **强大的WS-*支持**:CXF不仅支持基本的SOAP通信,还支持一系列高级的Web服务标准,如WS-Security(用于身份验证和加密)、WS-Addressing(用于消息路由)等。 3. **多种绑定和传输机制**:除了传统的SOAP over ...

    cxf-jar包.rar

    标题 "cxf-jar包.rar" 提供的是一组与Apache CXF相关的Java库,这是一套用于构建和开发Web服务的开源框架。这个压缩包包含的子文件都是...在CXF中,这个库用于实现XML消息的安全加密、签名等操作。 总结来说,这个"cx

    apache-cxf-2.4.0

    7. **安全特性**:CXF支持WS-Security等安全标准,可以实现身份验证、消息加密和完整性校验,确保服务的安全性。 8. **测试工具**:CXF提供了测试工具,如CXF TestSuite,可以帮助开发者进行服务的单元测试和集成...

Global site tag (gtag.js) - Google Analytics