文档章节

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

PanDongDong
 PanDongDong
发布于 2015/08/22 01:52
字数 1025
阅读 80
收藏 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

共有 人打赏支持
PanDongDong
粉丝 31
博文 35
码字总数 8940
作品 0
贵阳
后端工程师
私信 提问
Apache CXF 3.0.13 和 3.1.11 发布

Apache CXF 3.0.13 和 3.1.11 发布了,暂未发现具体更新内容。 点此查看 Apache CXF 3.0.13 和 3.1.11 的提交记录。 下载地址 和 发布主页 Apache CXF是一个开源的Service框架,它实现了JCP...

淡漠悠然
2017/04/06
851
3
Apache CXF 3.0.16 发布,开源的 Service 框架

Apache CXF 3.0.16 发布了。Apache CXF一个开源的Service框架,它实现了JCP与Web Service中一些重要标准。CXF简化了构造,集成,面 向服务架构(SOA)业务组件与技术的灵活复用。 主要更新内容...

达尔文
2017/11/30
803
0
Apache CXF 3.1.15 发布,开源的 Service 框架

Apache CXF 3.1.15 发布了。Apache CXF一个开源的Service框架,它实现了JCP与Web Service中一些重要标准。CXF简化了构造,集成,面向服务架构(SOA)业务组件与技术的灵活复用。 更新内容: Bu...

淡漠悠然
03/14
705
1
Apache CXF 3.0.2/2.7.13/2.6.16 发布

Apache CXF 今天发布了三个更新版本,这三个版本主要是 bug 的修复,超过 90 个 JIRA 上的问题得以解决。 下载地址: here. Apache CXF一个开源的Service框架,它实现了JCP与Web Service中一...

Nori
2014/11/18
4K
9
apache CXF wsdl2java工具的使用

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

Yao淡定
2014/02/21
0
0

没有更多内容

加载失败,请刷新页面

加载更多

寻找数学的广度——《这才是数学》读书笔记2700字

寻找数学的广度——《这才是数学》读书笔记2700字: 文|程哲。数学学习方式之广:国内外数学教育方面的专家,进行了很多种不同的数学学习方式尝试,如数学绘本、数学游戏、数学实验、数学步道...

原创小博客
6分钟前
0
0
vimrc

set rtp+=/usr/local/lib/python3.7/site-packages/powerline/bindings/vim/set laststatus=2set t_Co=256set cursorlinehi cursorline cterm=none term=nonehighlight CursorLine gui......

kut
8分钟前
0
0
ubuntu常用操作

显卡GPU 查看显卡信息sudo lshw -numeric -class video# 查看显卡型号lspci | grep -i nvidia# 查看驱动版本sudo dpkg --list | grep nvidia-*或者 ubuntu-drivers devices#查看显卡...

hc321
昨天
2
0
mysql密码重置

方法一: 在my.ini的[mysqld]字段加入: skip-grant-tables 重启mysql服务,这时的mysql不需要密码即可登录数据库 然后进入mysql mysql>use mysql; mysql>更新 update user set password=pas...

architect刘源源
昨天
6
1
SpringBoot + Mybatis 配置多数据源(Srping boot 二)

前置条件,你已经配置好spring boot+mybatis,可以参考之前的博客 实现逻辑通过注解+aop切面编程来动态更新datasource 第一步,配置多个DataSource server: port: 8080freezing: ...

小海bug
昨天
14
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部