文档章节

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

OkSerIous
 OkSerIous
发布于 2015/08/22 01:52
字数 1025
阅读 79
收藏 5

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

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

[java] view plaincopyprint?

<EMBED id=ZeroClipboardMovie_1 name=ZeroClipboardMovie_1 type=application/x-shockwave-flash align=middle pluginspage=http://www.macromedia.com/go/getflashplayer height=14 width=29 src=http://static.blog.csdn.net/scripts/ZeroClipboard/ZeroClipboard.swf wmode="transparent" flashvars="id=1&width=29&height=14" allowfullscreen="false" allowscriptaccess="always" bgcolor="#ffffff" quality="best" menu="false" loop="false">

  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的接口和实现类,这两个类和前面文章中介绍的没什么区别

[java] view plaincopyprint?

<EMBED id=ZeroClipboardMovie_2 name=ZeroClipboardMovie_2 type=application/x-shockwave-flash align=middle pluginspage=http://www.macromedia.com/go/getflashplayer height=14 width=29 src=http://static.blog.csdn.net/scripts/ZeroClipboard/ZeroClipboard.swf wmode="transparent" flashvars="id=2&width=29&height=14" allowfullscreen="false" allowscriptaccess="always" bgcolor="#ffffff" quality="best" menu="false" loop="false">

  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端代码

[java] view plaincopyprint?

<EMBED id=ZeroClipboardMovie_3 name=ZeroClipboardMovie_3 type=application/x-shockwave-flash align=middle pluginspage=http://www.macromedia.com/go/getflashplayer height=14 width=29 src=http://static.blog.csdn.net/scripts/ZeroClipboard/ZeroClipboard.swf wmode="transparent" flashvars="id=3&width=29&height=14" allowfullscreen="false" allowscriptaccess="always" bgcolor="#ffffff" quality="best" menu="false" loop="false">

  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端代码

[java] view plaincopyprint?

<EMBED id=ZeroClipboardMovie_4 name=ZeroClipboardMovie_4 type=application/x-shockwave-flash align=middle pluginspage=http://www.macromedia.com/go/getflashplayer height=14 width=29 src=http://static.blog.csdn.net/scripts/ZeroClipboard/ZeroClipboard.swf wmode="transparent" flashvars="id=4&width=29&height=14" allowfullscreen="false" allowscriptaccess="always" bgcolor="#ffffff" quality="best" menu="false" loop="false">

  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/目录下,下面是手动生成时使用的命令

[plain] view plaincopyprint?

<EMBED id=ZeroClipboardMovie_5 name=ZeroClipboardMovie_5 type=application/x-shockwave-flash align=middle pluginspage=http://www.macromedia.com/go/getflashplayer height=14 width=29 src=http://static.blog.csdn.net/scripts/ZeroClipboard/ZeroClipboard.swf wmode="transparent" flashvars="id=5&width=29&height=14" allowfullscreen="false" allowscriptaccess="always" bgcolor="#ffffff" quality="best" menu="false" loop="false">

  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来验证我们的测试。

本文转载自:http://blog.csdn.net/kongxx/article/details/7738717

共有 人打赏支持
OkSerIous
粉丝 30
博文 34
码字总数 4888
作品 0
贵阳
后端工程师
Cxf 集成spring完整示例

1 CXF概述 1.1 CXF介绍 Apache CXF =Celtix + XFire,Apache CXF 的前身叫 Apache CeltiXfire,现在已经正式更名为 Apache CXF 了,以下简称为 CXF。CXF 继承了 Celtix 和 XFire 两大开源项目...

Zero零_度
2015/08/19
0
0
Web Service 那点事儿(2)—— 使用 CXF 开发 SOAP 服务

选框架犹如选媳妇,选来选去,最后我还是选了“丑媳妇(CXF)”,为什么是它?因为 CXF 是 Apache 旗下的一款非常优秀的 WS 开源框架,具备轻量级的特性,而且能无缝整合到 Spring 中。 其实...

黄勇
2014/07/02
0
45
apache CXF wsdl2java工具的使用

最近,由于要用到某公司提供的webservice实现的api接口,想到了用cxf的wsdl2java工具来生成客户端程序。(自己写是比较麻烦且费时,so偷懒一下、、) 使用步骤如下: 一、下载apache cxf的包...

Yao淡定
2014/02/21
0
0
Apache CXF 3.2.5 和 3.1.16 发布,开源的 Service 框架

Apache CXF 3.2.5 和 3.1.16 已发布。Apache CXF 是一个开源的 Service 框架,它实现了 JCP 与 Web Service 中的一些重要标准。CXF 简化了构造、集成、面向服务架构(SOA)业务组件与技术的灵活...

淡漠悠然
07/04
0
0
spring+restful service

Spring整合CXF,发布RSETful 风格WebService 这篇文章是承接之前CXF整合Spring的这个项目示例的延伸,所以有很大一部分都是一样的。关于发布CXF WebServer和Spring整合CXF这里就不再多加赘述...

游宵
2014/04/25
0
1

没有更多内容

加载失败,请刷新页面

加载更多

RESTful架构详解

1. 什么是REST REST全称是Representational State Transfer,中文意思是表述(编者注:通常译为表征)性状态转移。 它首次出现在2000年Roy Fielding的博士论文中,Roy Fielding是HTTP规范的主...

kitty1116
21分钟前
0
0
精通Spring Boot——第十篇:Quartz动态配置定时任务

定时任务简述 定时任务,在企业开发中尤其重要,很多业务都是需要定时任务去做的。比如说10点开售某件东西,凌晨0点统计注册人数,统计其他各种等等。这个时候不可能说让人为的去开启某个开关...

developlee的潇洒人生
23分钟前
0
0
将一些内容输出到文件中

看到一个面试题,如下: 第八题: 一个字符串将其输入到一个文件中,代码如下: <?php$a = '[{"teamId": "43", "serial": "1"},{"teamId": "1", "serial": "2"},{"teamId": "14", "serial":...

vinci321
32分钟前
0
0
nginx的简单使用:负载均衡

nginx:反向代理的服务器;用户发送请求到nginx,nginx把请求发送给真正的服务器,等待服务器处理完数据并返回,再把数据发送给用户。 nginx作为一个反向代理服务器,能缓存我们项目的静态文...

osliang
今天
2
0
网站title标题被改并被百度网址安全中心提醒的解决办法

国庆假日期间我们Sine安全接到众多网站站长求助网站标题被改导致在百度搜索中百度安全中心提醒被拦截,导致网站正常用户无法浏览网站被跳转到一些菠菜du博网站,而且很明显的一个特征就是在百...

网站安全
今天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部