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

来源:互联网 发布:淘宝一颗钻要多少信誉 编辑:程序博客网 时间:2024/04/27 15:46

本文链接:http://blog.csdn.net/kongxx/article/details/7738717

Apache CXF实战之一 Hello World Web Service

Apache CXF实战之二 集成Sping与Web容器

Apache CXF实战之三 传输Java对象

Apache CXF实战之四 构建RESTful Web Service

Apache CXF实战之五 压缩Web Service数据

Apache CXF实战之六 创建安全的Web Service

Apache CXF实战之七 使用Web Service传输文件

Apache CXF实战之八 Map类型绑定

在使用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?
  1. package com.googlecode.garbagecan.cxfstudy.ssl;
  2. public class User {
  3. private String id;
  4. private String name;
  5. private String password;
  6. public String getId() {
  7. return id;
  8. }
  9. public void setId(String id) {
  10. this.id = id;
  11. }
  12. public String getName() {
  13. return name;
  14. }
  15. public void setName(String name) {
  16. this.name = name;
  17. }
  18. public String getPassword() {
  19. return password;
  20. }
  21. public void setPassword(String password) {
  22. this.password = password;
  23. }
  24. }
2. 下面是Web Service的接口和实现类,这两个类和前面文章中介绍的没什么区别

[java] view plaincopyprint?
  1. package com.googlecode.garbagecan.cxfstudy.ssl;
  2. import java.util.List;
  3. import javax.jws.WebMethod;
  4. import javax.jws.WebResult;
  5. import javax.jws.WebService;
  6. @WebService
  7. public interface UserService {
  8. @WebMethod
  9. @WebResult List<User> list();
  10. }
  11. package com.googlecode.garbagecan.cxfstudy.ssl;
  12. import java.util.ArrayList;
  13. import java.util.List;
  14. public class UserServiceImplimplements UserService {
  15. public List<User> list() {
  16. List<User> users = new ArrayList<User>();
  17. for (int i =0; i < 10; i++) {
  18. User user = new User();
  19. user.setId("" + i);
  20. user.setName("user_" + i);
  21. user.setPassword("password_" + i);
  22. users.add(user);
  23. }
  24. return users;
  25. }
  26. }
3. 下面看看Server端代码
[java] view plaincopyprint?
  1. package com.googlecode.garbagecan.cxfstudy.ssl;
  2. import java.io.File;
  3. import java.io.FileInputStream;
  4. import java.security.KeyStore;
  5. import javax.net.ssl.KeyManager;
  6. import javax.net.ssl.KeyManagerFactory;
  7. import javax.net.ssl.TrustManager;
  8. import javax.net.ssl.TrustManagerFactory;
  9. import org.apache.cxf.configuration.jsse.TLSServerParameters;
  10. import org.apache.cxf.configuration.security.ClientAuthentication;
  11. import org.apache.cxf.configuration.security.FiltersType;
  12. import org.apache.cxf.endpoint.Server;
  13. import org.apache.cxf.jaxws.JaxWsServerFactoryBean;
  14. import org.apache.cxf.transport.http_jetty.JettyHTTPServerEngineFactory;
  15. public class MyServer {
  16. private staticfinal int port =12345;
  17. private staticfinal String address = "https://0.0.0.0:"+port+"/ws/ssl/userService";
  18. public staticvoid main(String[] args) throws Exception {
  19. System.out.println("Starting Server");
  20. configureSSLOnTheServer();
  21. JaxWsServerFactoryBean factoryBean = new JaxWsServerFactoryBean();
  22. factoryBean.setServiceClass(UserServiceImpl.class);
  23. factoryBean.setAddress(address);
  24. Server server = factoryBean.create();
  25. String endpoint = server.getEndpoint().getEndpointInfo().getAddress();
  26. System.out.println("Server started at " + endpoint);
  27. }
  28. public staticvoid configureSSLOnTheServer() {
  29. File file = new File(MyServer.class.getResource("/com/googlecode/garbagecan/cxfstudy/ssl/test.jks").getFile());
  30. try {
  31. TLSServerParameters tlsParams = new TLSServerParameters();
  32. KeyStore keyStore = KeyStore.getInstance("JKS");
  33. String password = "mypassword";
  34. String storePassword = "mypassword";
  35. keyStore.load(new FileInputStream(file), storePassword.toCharArray());
  36. KeyManagerFactory keyFactory = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());
  37. keyFactory.init(keyStore, password.toCharArray());
  38. KeyManager[] keyManagers = keyFactory.getKeyManagers();
  39. tlsParams.setKeyManagers(keyManagers);
  40. keyStore.load(new FileInputStream(file), storePassword.toCharArray());
  41. TrustManagerFactory trustFactory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
  42. trustFactory.init(keyStore);
  43. TrustManager[] trustManagers = trustFactory.getTrustManagers();
  44. tlsParams.setTrustManagers(trustManagers);
  45. FiltersType filtersTypes = new FiltersType();
  46. filtersTypes.getInclude().add(".*_EXPORT_.*");
  47. filtersTypes.getInclude().add(".*_EXPORT1024_.*");
  48. filtersTypes.getInclude().add(".*_WITH_DES_.*");
  49. filtersTypes.getInclude().add(".*_WITH_NULL_.*");
  50. filtersTypes.getExclude().add(".*_DH_anon_.*");
  51. tlsParams.setCipherSuitesFilter(filtersTypes);
  52. ClientAuthentication ca = new ClientAuthentication();
  53. ca.setRequired(true);
  54. ca.setWant(true);
  55. tlsParams.setClientAuthentication(ca);
  56. JettyHTTPServerEngineFactory factory = new JettyHTTPServerEngineFactory();
  57. factory.setTLSServerParametersForPort(port, tlsParams);
  58. } catch (Exception e) {
  59. e.printStackTrace();
  60. }
  61. }
  62. }
4. 下面看看Client端代码

[java] view plaincopyprint?
  1. package com.googlecode.garbagecan.cxfstudy.ssl;
  2. import java.io.File;
  3. import java.io.FileInputStream;
  4. import java.security.KeyStore;
  5. import javax.net.ssl.KeyManager;
  6. import javax.net.ssl.KeyManagerFactory;
  7. import javax.net.ssl.TrustManager;
  8. import javax.net.ssl.TrustManagerFactory;
  9. import org.apache.cxf.configuration.jsse.TLSClientParameters;
  10. import org.apache.cxf.configuration.security.FiltersType;
  11. import org.apache.cxf.endpoint.Client;
  12. import org.apache.cxf.frontend.ClientProxy;
  13. import org.apache.cxf.jaxws.JaxWsProxyFactoryBean;
  14. import org.apache.cxf.transport.http.HTTPConduit;
  15. public class MyClient {
  16. private staticfinal String address = "https://localhost:12345/ws/ssl/userService";
  17. public staticvoid main(String[] args) throws Exception {
  18. JaxWsProxyFactoryBean factoryBean = new JaxWsProxyFactoryBean();
  19. factoryBean.setAddress(address);
  20. factoryBean.setServiceClass(UserService.class);
  21. Object obj = factoryBean.create();
  22. UserService userService = (UserService) obj;
  23. configureSSLOnTheClient(userService);
  24. System.out.println(userService.list());
  25. }
  26. private staticvoid configureSSLOnTheClient(Object obj) {
  27. File file = new File(MyServer.class.getResource("/com/googlecode/garbagecan/cxfstudy/ssl/test.jks").getFile());
  28. Client client = ClientProxy.getClient(obj);
  29. HTTPConduit httpConduit = (HTTPConduit) client.getConduit();
  30. try {
  31. TLSClientParameters tlsParams = new TLSClientParameters();
  32. tlsParams.setDisableCNCheck(true);
  33. KeyStore keyStore = KeyStore.getInstance("JKS");
  34. String password = "mypassword";
  35. String storePassword = "mypassword";
  36. keyStore.load(new FileInputStream(file), storePassword.toCharArray());
  37. TrustManagerFactory trustFactory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
  38. trustFactory.init(keyStore);
  39. TrustManager[] trustManagers = trustFactory.getTrustManagers();
  40. tlsParams.setTrustManagers(trustManagers);
  41. keyStore.load(new FileInputStream(file), storePassword.toCharArray());
  42. KeyManagerFactory keyFactory = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());
  43. keyFactory.init(keyStore, password.toCharArray());
  44. KeyManager[] keyManagers = keyFactory.getKeyManagers();
  45. tlsParams.setKeyManagers(keyManagers);
  46. FiltersType filtersTypes = new FiltersType();
  47. filtersTypes.getInclude().add(".*_EXPORT_.*");
  48. filtersTypes.getInclude().add(".*_EXPORT1024_.*");
  49. filtersTypes.getInclude().add(".*_WITH_DES_.*");
  50. filtersTypes.getInclude().add(".*_WITH_NULL_.*");
  51. filtersTypes.getExclude().add(".*_DH_anon_.*");
  52. tlsParams.setCipherSuitesFilter(filtersTypes);
  53. httpConduit.setTlsClientParameters(tlsParams);
  54. } catch (Exception e) {
  55. e.printStackTrace();
  56. }
  57. }
  58. }
5. 我们需要手动生成jks文件,并将其放在maven工程resources的/com/googlecode/garbagecan/cxfstudy/ssl/目录下,下面是手动生成时使用的命令

[plain] view plaincopyprint?
  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来验证我们的测试。
原创粉丝点击