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

CXF SSL HTTPS

 
阅读更多

SSL:tomcat  server.xml配置

 

 

 <!-- SSL -->
    <Connector  port="8443" maxHttpHeaderSize="8192"  
		SSLEnabled="true"
        maxThreads="150"  
        minSpareThreads="25"  
        maxSpareThreads="75"  
        enableLookups="false"  
        disableUploadTimeout="true"  
        acceptCount="100"  
        scheme="https"  
        secure="true"  
        clientAuth="false"  
        sslProtocol="TLS"  
        keystoreFile="D:\tomcat6\conf\ssl\server.jks"  
        keystorePass="123456"  
        algorithm="SunX509"  
     /> 
    <!-- SSL END -->
 

 

 

 

<!-- CXF 服务端 -->
	<jaxws:endpoint id="userWebService" implementor="#userServiceImpl" 
		address="/userservice">
		<jaxws:inInterceptors>
			<bean class="org.apache.cxf.interceptor.LoggingInInterceptor"></bean>
			<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="clientPasswordCallback" class="webservice.cxf.clientPasswordCalback.ClientPasswordCallback"></bean>
	
	<!-- SSL -->
	
	<!-- CXF 客户端 -->
	<bean id="userServiceSSL" class="webservice.cxf.client.UserService" factory-bean="clientFactorySSL" factory-method="create" />
	<bean id="clientFactorySSL" class="org.apache.cxf.jaxws.JaxWsProxyFactoryBean">
		<property name="address" value="https://127.0.0.1:8443/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.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>
 

 

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");
		}
	}

}

 

 

Test:

 

 

package cxf.client.test;

import java.io.IOException;
import java.io.InputStream;
import java.security.KeyStore;
import java.security.KeyStoreException;
import java.security.NoSuchAlgorithmException;
import java.security.UnrecoverableKeyException;
import java.security.cert.CertificateException;
import java.util.List;

import javax.net.ssl.KeyManager;
import javax.net.ssl.KeyManagerFactory;
import javax.net.ssl.TrustManager;
import javax.net.ssl.TrustManagerFactory;

import org.apache.cxf.configuration.jsse.TLSClientParameters;
import org.apache.cxf.endpoint.Client;
import org.apache.cxf.frontend.ClientProxy;
import org.apache.cxf.transport.http.HTTPConduit;
import org.junit.Before;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import webservice.cxf.client.Person;
import webservice.cxf.client.UserService;


public class Spring_Cxf_Client_Test {
	ApplicationContext app ;
	
	@Before
	public void initAPP(){
		app = new ClassPathXmlApplicationContext("cxf-client.xml");
	}
	
	private final static String trustStore = "truststore.jks";  
        private final static String keyStore = "client.jks";  
        private final static String trustStorePass = "123456";  
        private final static String keyStorePass = "123456";  
	@Test
	public void testSSL() throws IOException{
		UserService us = (UserService) app.getBean("userServiceSSL");
		Client proxy = ClientProxy.getClient(us);
		HTTPConduit conduit = (HTTPConduit) proxy.getConduit();    
        TLSClientParameters tlsParams = conduit.getTlsClientParameters();
        
        if (tlsParams == null) {
            tlsParams = new TLSClientParameters();
        }
        tlsParams.setSecureSocketProtocol("SSL");
        tlsParams.setKeyManagers(getKeyManagers());
        tlsParams.setTrustManagers(getTrustManagers());
        conduit.setTlsClientParameters(tlsParams);
        
		String response = us.sayhello("SSL");
		System.out.println(response);
		List<Person> ps = us.getAllUser();
		for (Person person : ps) {
			System.out.println("#####"+person.getId()+"#####"+person.getName()+"#####"+person.getCity()+"#####");
		}
	}
	
	private static TrustManager[] getTrustManagers() throws IOException {
		try {
			String alg = TrustManagerFactory.getDefaultAlgorithm();
			TrustManagerFactory factory = TrustManagerFactory.getInstance(alg);
			InputStream fp = Spring_Cxf_Client_Test.class.getResourceAsStream(trustStore);
			KeyStore ks = KeyStore.getInstance("JKS");
			ks.load(fp, trustStorePass.toCharArray());
			fp.close();
			factory.init(ks);
			TrustManager[] tms = factory.getTrustManagers();
			return tms;
		} catch (NoSuchAlgorithmException e) {
			e.printStackTrace();
		} catch (KeyStoreException e) {
			e.printStackTrace();
		} catch (CertificateException e) {
			e.printStackTrace();
		}
		return null;
	}
	
	private static KeyManager[] getKeyManagers() throws IOException {
		try {
			String alg = KeyManagerFactory.getDefaultAlgorithm();
			KeyManagerFactory factory = KeyManagerFactory.getInstance(alg);
			InputStream fp = Spring_Cxf_Client_Test.class.getResourceAsStream(keyStore);
			KeyStore ks = KeyStore.getInstance("JKS");
			ks.load(fp, keyStorePass.toCharArray());
			fp.close();
			factory.init(ks, keyStorePass.toCharArray());
			KeyManager[] keyms = factory.getKeyManagers();
			return keyms;
		} catch (NoSuchAlgorithmException e) {
			e.printStackTrace();
		} catch (KeyStoreException e) {
			e.printStackTrace();
		} catch (CertificateException e) {
			e.printStackTrace();
		} catch (UnrecoverableKeyException e) {
			e.printStackTrace();
		}
		return null;
	}
	
}
 

 

 

分享到:
评论

相关推荐

    CXF实现SSL安全验证

    本文将详细介绍如何使用 CXF 实现 SSL 安全验证,并在此基础上构建 HTTPS 的 Web Service。 ### 步骤一:生成密钥库 (Keystore) 首先,我们需要创建一个密钥库(Keystore),这是一个存储私钥和公钥证书的地方。在...

    cxf https webservice

    3. **调用HTTPS Web Service**:使用CXF调用HTTPS Web Service,首先需要配置CXF客户端来支持SSL。这包括设置信任商店(Truststore)和密钥商店(Keystore),并指定相应的密码。此外,可能还需要处理证书验证问题,...

    spring+CXF实现WebService(http+https)

    本教程将深入探讨如何利用Spring和CXF来实现基于HTTP和HTTPS的Web服务,并且将涉及到HTTPS的证书配置。 1. **Spring与CXF结合**: Spring框架提供了灵活的依赖注入和AOP(面向切面编程)特性,可以方便地集成各种...

    cxf-https spring5.0

    在IT行业中,集成Spring 5.0、CXF 3.2和...下载后,可以通过解压并导入到IDE(如IntelliJ IDEA或Eclipse)来研究和学习如何在Spring 5.0和CXF 3.2中实现HTTPS支持。记得替换配置文件中的路径和密码以适应你的环境。

    使用cxf和spring开发基于https的webservice服务端以及客户端样例

    同时,配置HTTPS需要在CXF的Servlet配置中启用SSL,指定密钥库路径和密码。 客户端开发相对简单,它通过CXF的WSClientAPI动态生成代理对象,调用远程服务。首先,我们需要设置HTTPS的信任管理器,信任服务端的证书...

    cxf-ssl:JBossWS-CXF SSL 客户端示例

    JBoss EAP 6 中的 #CXF SSL 客户端 这是一个展示如何设置 JBossWS CXF SSL 客户端的项目。 除此之外,它还展示了如何在 EAP 6 中自动安装 HTTPS 连接并配置独立客户端以使用 JBoss LogManager。 此示例将在客户端和...

    4.CXF安全访问之单向SSL或者双向SSL(三)

    SSL通常应用于HTTP协议,形成HTTPS,使得网络通信变得更加安全。 **单向SSL**,也称为客户端验证,主要涉及服务器对客户端的身份验证。在这个过程中,服务器会向客户端发送其数字证书,客户端通过验证证书的签名来...

    基于SSL验证的Apache CXF客户端设计

    基于SSL验证的Apache CXF客户端设计 1,服务器端Tomcat配置SSL支持 2,服务器端Web Service接口设计 3,客户端访问设计,包括代码和配置文件 详情请看博客:...

    Apache Cxf 安全认证

    在CA证书验证方法中,Apache CXF提供了另一种安全机制,即使用SSL/TLS协议。CA证书验证通常涉及到数字证书的使用,这些证书由受信任的证书颁发机构签发。在Apache CXF中,可以设置信任证书管理器来确保服务端只接受...

    spring CXF集成,实现webservice(包含https)

    这涉及到SSL/TLS证书的生成和配置,以及CXF和Spring的相应设置。在Spring配置中,可以设置`serverFactoryBean.setProtocol("https")`,并指定证书路径和密钥库信息。 5. **测试与部署**:完成上述配置后,可以通过...

    CFX构建webservice实例,与Spring整合;以及调用https协议的webservice,附带源码,及其证书

    - HTTPS安全基础:HTTPS是HTTP协议与SSL/TLS协议的结合,用于加密传输数据,确保通信的安全性。 - 配置证书:为客户端和服务端生成或获取数字证书,以建立安全连接。证书可能需要导入到Java的信任库或CXF配置中。 ...

    cxf服务端和客户端所需jar包

    CXF提供了一套完整的安全框架,包括基本认证、SSL/TLS、WS-Security等。相关jar包如`cxf-rt-security.jar`和`cxf-rt-ws-policy.jar`处理这些安全机制。 6. **测试工具**: 在开发和测试阶段,CXF提供了诸如`cxf-...

    apache-cxf-2.0.10.zip下载地址

    8. **安全特性**:包括WS-Security、SSL/TLS支持,可以实现身份验证、加密和消息完整性保护。 在"apache-cxf-2.0.10.zip"压缩包中,通常会包含以下内容: 1. **库文件**:包含了CXF运行所需的JAR文件,如cxf-api....

    apache-cxf-3.1.1跟3.1.6所有jar包

    7. **安全性**:CXF提供了多种安全机制,如基本认证、Digest认证、OAuth、SSL/TLS以及WS-Security,确保Web服务的安全通信。 在"apache-cxf-3.1.1跟3.1.6所有jar包"中,每个版本通常会包含一组核心库和扩展库,这些...

    cxf-2.3.11源码

    7. **安全**:CXF提供了多种安全机制,包括基本认证、 Digest认证、SSL/TLS、WS-Security等,以确保Web服务的安全性。 8. **测试工具**:CXF提供了一套测试工具,如模拟服务器、客户端测试工具,方便开发者进行服务...

    cxf整合spring发布webservice(源码)

    1. **SSL/TLS支持**:为了保证通信安全,可以配置CXF使用HTTPS协议,加密传输数据。 2. **身份验证和授权**:通过Spring Security或其他安全框架,可以实现Web服务的身份验证和权限控制。 以上就是Linux环境下,...

    cxf+spring+client

    CXF支持多种协议,如HTTP、HTTPS、JMS等,以及多种绑定和数据格式,包括SOAP、REST、XML和JSON。在与Spring结合时,CXF服务可以通过Spring的依赖注入(DI)和配置管理功能来轻松管理和扩展。 在"**cxf+spring+...

    cxf开发工具包

    - 安全性:支持基本认证、SSL、WS-Security等。 - 传输和绑定:如HTTP、HTTPS、FTP等传输方式,以及XML/HTTP、SOAP/HTTP绑定。 - 扩展:包括Spring整合、测试工具等。 这个工具包中的示例项目可以帮助初学者快速...

    apache-cxf-2.1.4

    8. **安全性**:CXF提供了各种安全机制,包括基本认证、 Digest认证、SSL/TLS、WS-Security等,确保服务的安全性。 9. **工具支持**:CXF提供了CXF wsdl2java和java2wsdl工具,用于在Java类和WSDL之间互相转换。 ...

    apache CXF 2 way SLL

    ### Apache CXF 2 Way SSL 实现安全的 WebService 通信 #### 一、Apache CXF 概述 Apache CXF 是一个强大的开源框架,用于构建和服务 WebServices。它不仅支持传统的 SOAP 协议,同时也支持 RESTful 风格的服务。...

Global site tag (gtag.js) - Google Analytics