`
wake.up
  • 浏览: 13806 次
社区版块
存档分类
最新评论

Apache CXF实战之四 发布使用SSL的Web Service

    博客分类:
  • cxf
阅读更多

在使用Web Service的时候,在很多情况下会要求我们发布ssl的web service,此时如果web service是作为一个war包部署在tomcat之类的web容器中的时候,我们可以通过修改tomcat的配置来比较容易的部署发布成ssl的 web service的,当对于独立运行的程序来书,此时发布web service是需要一些操作的,下面看看在CXF中怎样发布并调用SSL的Web Service。

1. 首先是一个pojo的实体类

 

  1. package com.googlecode.garbagecan.cxfstudy.ssl;  
  2.   
  3. public class User {  
  4.     private String id;  
  5.     private String name;  
  6.     private String password;  
  7.     public String getId() {  
  8.         return id;  
  9.     }  
  10.     public void setId(String id) {  
  11.         this.id = id;  
  12.     }  
  13.     public String getName() {  
  14.         return name;  
  15.     }  
  16.     public void setName(String name) {  
  17.         this.name = name;  
  18.     }  
  19.     public String getPassword() {  
  20.         return password;  
  21.     }  
  22.     public void setPassword(String password) {  
  23.         this.password = password;  
  24.     }  
  25. }  

2. 下面是Web Service的接口和实现类,这两个类和前面文章中介绍的没什么区别

 

 

  1. package com.googlecode.garbagecan.cxfstudy.ssl;  
  2.   
  3. import java.util.List;  
  4.   
  5. import javax.jws.WebMethod;  
  6. import javax.jws.WebResult;  
  7. import javax.jws.WebService;  
  8.   
  9. @WebService  
  10. public interface UserService {  
  11.     @WebMethod  
  12.     @WebResult List<User> list();  
  13.   
  14. }  
  15.   
  16. package com.googlecode.garbagecan.cxfstudy.ssl;  
  17.   
  18. import java.util.ArrayList;  
  19. import java.util.List;  
  20.   
  21. public class UserServiceImpl implements UserService {  
  22.   
  23.     public List<User> list() {  
  24.         List<User> users = new ArrayList<User>();  
  25.         for (int i = 0; i < 10; i++) {  
  26.             User user = new User();  
  27.             user.setId("" + i);  
  28.             user.setName("user_" + i);  
  29.             user.setPassword("password_" + i);  
  30.             users.add(user);  
  31.         }  
  32.         return users;  
  33.     }  
  34.   
  35. }  

3. 下面看看Server端代码

  1. package com.googlecode.garbagecan.cxfstudy.ssl;  
  2.   
  3. import java.io.File;  
  4. import java.io.FileInputStream;  
  5. import java.security.KeyStore;  
  6.   
  7. import javax.net.ssl.KeyManager;  
  8. import javax.net.ssl.KeyManagerFactory;  
  9. import javax.net.ssl.TrustManager;  
  10. import javax.net.ssl.TrustManagerFactory;  
  11.   
  12. import org.apache.cxf.configuration.jsse.TLSServerParameters;  
  13. import org.apache.cxf.configuration.security.ClientAuthentication;  
  14. import org.apache.cxf.configuration.security.FiltersType;  
  15. import org.apache.cxf.endpoint.Server;  
  16. import org.apache.cxf.jaxws.JaxWsServerFactoryBean;  
  17. import org.apache.cxf.transport.http_jetty.JettyHTTPServerEngineFactory;  
  18.   
  19. public class MyServer {  
  20.   
  21.     private static final int port = 12345;  
  22.       
  23.     private static final String address = "https://0.0.0.0:"+port+"/ws/ssl/userService";  
  24.   
  25.     public static void main(String[] args) throws Exception {  
  26.         System.out.println("Starting Server");  
  27.           
  28.         configureSSLOnTheServer();  
  29.           
  30.         JaxWsServerFactoryBean factoryBean = new JaxWsServerFactoryBean();  
  31.         factoryBean.setServiceClass(UserServiceImpl.class);  
  32.         factoryBean.setAddress(address);  
  33.           
  34.         Server server = factoryBean.create();  
  35.         String endpoint = server.getEndpoint().getEndpointInfo().getAddress();  
  36.   
  37.         System.out.println("Server started at " + endpoint);  
  38.     }  
  39.   
  40.     public static void configureSSLOnTheServer() {  
  41.         File file = new File(MyServer.class.getResource("/com/googlecode/garbagecan/cxfstudy/ssl/test.jks").getFile());  
  42.           
  43.         try {  
  44.             TLSServerParameters tlsParams = new TLSServerParameters();  
  45.             KeyStore keyStore = KeyStore.getInstance("JKS");  
  46.             String password = "mypassword";  
  47.             String storePassword = "mypassword";  
  48.               
  49.             keyStore.load(new FileInputStream(file), storePassword.toCharArray());  
  50.             KeyManagerFactory keyFactory = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());  
  51.             keyFactory.init(keyStore, password.toCharArray());  
  52.             KeyManager[] keyManagers = keyFactory.getKeyManagers();  
  53.             tlsParams.setKeyManagers(keyManagers);  
  54.   
  55.             keyStore.load(new FileInputStream(file), storePassword.toCharArray());  
  56.             TrustManagerFactory trustFactory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());  
  57.             trustFactory.init(keyStore);  
  58.             TrustManager[] trustManagers = trustFactory.getTrustManagers();  
  59.             tlsParams.setTrustManagers(trustManagers);  
  60.               
  61.             FiltersType filtersTypes = new FiltersType();  
  62.             filtersTypes.getInclude().add(".*_EXPORT_.*");  
  63.             filtersTypes.getInclude().add(".*_EXPORT1024_.*");  
  64.             filtersTypes.getInclude().add(".*_WITH_DES_.*");  
  65.             filtersTypes.getInclude().add(".*_WITH_NULL_.*");  
  66.             filtersTypes.getExclude().add(".*_DH_anon_.*");  
  67.             tlsParams.setCipherSuitesFilter(filtersTypes);  
  68.               
  69.             ClientAuthentication ca = new ClientAuthentication();  
  70.             ca.setRequired(true);  
  71.             ca.setWant(true);  
  72.             tlsParams.setClientAuthentication(ca);  
  73.               
  74.             JettyHTTPServerEngineFactory factory = new JettyHTTPServerEngineFactory();  
  75.             factory.setTLSServerParametersForPort(port, tlsParams);  
  76.         } catch (Exception e) {  
  77.             e.printStackTrace();  
  78.         }  
  79.     }  
  80.   
  81. }  

4. 下面看看Client端代码

 

 

  1. package com.googlecode.garbagecan.cxfstudy.ssl;  
  2.   
  3. import java.io.File;  
  4. import java.io.FileInputStream;  
  5. import java.security.KeyStore;  
  6.   
  7. import javax.net.ssl.KeyManager;  
  8. import javax.net.ssl.KeyManagerFactory;  
  9. import javax.net.ssl.TrustManager;  
  10. import javax.net.ssl.TrustManagerFactory;  
  11.   
  12. import org.apache.cxf.configuration.jsse.TLSClientParameters;  
  13. import org.apache.cxf.configuration.security.FiltersType;  
  14. import org.apache.cxf.endpoint.Client;  
  15. import org.apache.cxf.frontend.ClientProxy;  
  16. import org.apache.cxf.jaxws.JaxWsProxyFactoryBean;  
  17. import org.apache.cxf.transport.http.HTTPConduit;  
  18.   
  19. public class MyClient {  
  20.   
  21.     private static final String address = "https://localhost:12345/ws/ssl/userService";  
  22.   
  23.     public static void main(String[] args) throws Exception {  
  24.         JaxWsProxyFactoryBean factoryBean = new JaxWsProxyFactoryBean();  
  25.         factoryBean.setAddress(address);  
  26.         factoryBean.setServiceClass(UserService.class);  
  27.         Object obj = factoryBean.create();  
  28.         UserService userService = (UserService) obj;  
  29.           
  30.         configureSSLOnTheClient(userService);  
  31.   
  32.         System.out.println(userService.list());  
  33.     }  
  34.   
  35.     private static void configureSSLOnTheClient(Object obj) {  
  36.         File file = new File(MyServer.class.getResource("/com/googlecode/garbagecan/cxfstudy/ssl/test.jks").getFile());  
  37.           
  38.         Client client = ClientProxy.getClient(obj);  
  39.         HTTPConduit httpConduit = (HTTPConduit) client.getConduit();  
  40.   
  41.         try {  
  42.             TLSClientParameters tlsParams = new TLSClientParameters();  
  43.             tlsParams.setDisableCNCheck(true);  
  44.   
  45.             KeyStore keyStore = KeyStore.getInstance("JKS");  
  46.             String password = "mypassword";  
  47.             String storePassword = "mypassword";  
  48.               
  49.             keyStore.load(new FileInputStream(file), storePassword.toCharArray());  
  50.             TrustManagerFactory trustFactory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());  
  51.             trustFactory.init(keyStore);  
  52.             TrustManager[] trustManagers = trustFactory.getTrustManagers();  
  53.             tlsParams.setTrustManagers(trustManagers);  
  54.   
  55.             keyStore.load(new FileInputStream(file), storePassword.toCharArray());  
  56.             KeyManagerFactory keyFactory = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());  
  57.             keyFactory.init(keyStore, password.toCharArray());  
  58.             KeyManager[] keyManagers = keyFactory.getKeyManagers();  
  59.             tlsParams.setKeyManagers(keyManagers);  
  60.               
  61.             FiltersType filtersTypes = new FiltersType();  
  62.             filtersTypes.getInclude().add(".*_EXPORT_.*");  
  63.             filtersTypes.getInclude().add(".*_EXPORT1024_.*");  
  64.             filtersTypes.getInclude().add(".*_WITH_DES_.*");  
  65.             filtersTypes.getInclude().add(".*_WITH_NULL_.*");  
  66.             filtersTypes.getExclude().add(".*_DH_anon_.*");  
  67.             tlsParams.setCipherSuitesFilter(filtersTypes);  
  68.   
  69.             httpConduit.setTlsClientParameters(tlsParams);  
  70.         } catch (Exception e) {  
  71.             e.printStackTrace();  
  72.         }  
  73.     }  
  74. }  

5. 我们需要手动生成jks文件,并将其放在maven工程resources的/com/googlecode/garbagecan/cxfstudy/ssl/目录下,下面是手动生成时使用的命令

 

 

  1. keytool -genkey -alias test -keyalg RSA -keypass mypassword -storepass mypassword -dname "CN=, OU=, O=, L=, ST=, C=" -validity 3650 -keystore test.jks  

6. 最后我们可以通过启动MyServer和MyClient来验证我们的测试。

分享到:
评论

相关推荐

    Apache CXF Web Service Development(源码)

    【标题】中的"Apache CXF Web Service Development"指的是使用Apache CXF框架进行Web服务开发的过程。这通常包括了创建服务接口、实现服务逻辑、配置服务端点、以及发布和调用服务等步骤。源码部分可能包含了示例...

    实战Web Service —— 使用Apache CXF开发Web服务的教程

    **实战Web Service与Apache CXF开发** Web服务是一种在互联网上进行通信的标准协议,它允许应用程序之间进行数据交换。Apache CXF是一个开源框架,用于构建和部署Web服务,支持多种Web服务标准,如SOAP、RESTful ...

    Apache CXF开发Web Service 开发Web Service之Kick Start

    "Apache CXF开发Web Service - 开发Web Service之Kick Start"的主题意味着我们将深入探讨如何快速入门使用CXF进行Web服务开发。 首先,我们来看一下CXF的主要功能。CXF支持多种Web服务规范,如SOAP、RESTful(基于...

    apache cxf_jar包

    9. **cxf-rt-transports-jms-2.7.12.jar**: JMS(Java Message Service)传输模块,提供了使用JMS作为Web服务传输机制的能力,这对于分布式系统和异步通信很有价值。 10. **cxf-rt-databinding-jaxb-2.7.12.jar**: ...

    实战Web Service 之CXF

    实战Web Service 之 CXF 实战Web Service 之 CXF

    Apache CXF之结合Spring配置发布WebServices(Aegis数据绑定)

    在本话题中,我们将关注Apache CXF与Spring框架的集成,以及如何使用Aegis数据绑定来发布Web Services。 Spring是一个流行的Java企业级应用框架,它提供了丰富的功能,包括依赖注入、事务管理、数据访问等。Apache ...

    Apache CXF Web Service Development.pdf

    ### Apache CXF Web Service 开发相关知识点 #### 一、Apache CXF简介 Apache CXF 是一个开源项目,提供了一套强大的框架用于构建和开发基于Java的Web服务。它支持多种协议,包括SOAP和REST,并且能够很好地与其他...

    Developing Web Services with Apache CXF and Axis2(3rd Edition).zip

    Apache CXF = Celtix + XFire,Apache CXF 的前身叫 Apache ...WSDL 优先(WSDL First)来轻松地实现 Web Services 的发布和使用。Apache CXF已经是一个正式的Apache顶级项目。 Apache CXF 是一个开源的 Services 框架

    Apache CXF Web service 资料

    详细的从入门到精通, 手把手的教你做WEB SERVICE 该资源借花献佛,是一个高手写的,我在这里借花献佛,推广推广,让大家多一个学习的机会,吃水不忘挖井人,轻大家也谢谢写该文档的高手

    基于Apache CXF构建SOA应用

    Apache CXF 框架是一个比较有前途的开源 Web Services 框架,也是构建 SOA 架构应用的利器。本书采用案例源码和解说形式全面...最后,本书还描述了 Apache CXF 的工具、配置、调试、日志、部署和发布等使用的相关内容。

    Apache CXF开发Web Service 理解CXF Frontends之Code-First

    本文将深入探讨Apache CXF的Code-First开发模式,以及如何使用此框架来创建和理解Web服务。 首先,我们需要了解CXF的Code-First工作流程。在Code-First中,我们从编写Java类开始,这些类定义了服务的业务逻辑。CXF...

    apache-cxf-3.5.0.zip

    Apache CXF 是一款广泛使用的开源框架,主要用于构建和部署高质量的Web服务。它以其灵活性、易用性和强大的功能集而闻名。"apache-cxf-3.5.0.zip" 文件包含了CXF框架的3.5.0版本,该版本可能包含了一些新特性、改进...

Global site tag (gtag.js) - Google Analytics