Apache CXF實戰之九 發佈使用SSL的Web Service

在使用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.     } 
package com.googlecode.garbagecan.cxfstudy.ssl;

public class User {
	private String id;
	private String name;
	private String password;
	public String getId() {
		return id;
	}
	public void setId(String id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getPassword() {
		return password;
	}
	public void setPassword(String password) {
		this.password = password;
	}
}
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. package com.googlecode.garbagecan.cxfstudy.ssl; 
  16.  
  17. import java.util.ArrayList; 
  18. import java.util.List; 
  19.  
  20. public class UserServiceImpl implements UserService { 
  21.  
  22.     public List<User> list() { 
  23.         List<User> users = new ArrayList<User>(); 
  24.         for (int i = 0; i < 10; i++) { 
  25.             User user = new User(); 
  26.             user.setId("" + i); 
  27.             user.setName("user_" + i); 
  28.             user.setPassword("password_" + i); 
  29.             users.add(user); 
  30.         } 
  31.         return users; 
  32.     } 
  33.  
package com.googlecode.garbagecan.cxfstudy.ssl;

import java.util.List;

import javax.jws.WebMethod;
import javax.jws.WebResult;
import javax.jws.WebService;

@WebService
public interface UserService {
	@WebMethod
	@WebResult List<User> list();

}

package com.googlecode.garbagecan.cxfstudy.ssl;

import java.util.ArrayList;
import java.util.List;

public class UserServiceImpl implements UserService {

	public List<User> list() {
		List<User> users = new ArrayList<User>();
		for (int i = 0; i < 10; i++) {
			User user = new User();
			user.setId("" + i);
			user.setName("user_" + i);
			user.setPassword("password_" + i);
			users.add(user);
		}
		return users;
	}

}
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.  
package com.googlecode.garbagecan.cxfstudy.ssl;

import java.io.File;
import java.io.FileInputStream;
import java.security.KeyStore;

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.TLSServerParameters;
import org.apache.cxf.configuration.security.ClientAuthentication;
import org.apache.cxf.configuration.security.FiltersType;
import org.apache.cxf.endpoint.Server;
import org.apache.cxf.jaxws.JaxWsServerFactoryBean;
import org.apache.cxf.transport.http_jetty.JettyHTTPServerEngineFactory;

public class MyServer {

	private static final int port = 12345;
	
	private static final String address = "https://0.0.0.0:"+port+"/ws/ssl/userService";

	public static void main(String[] args) throws Exception {
		System.out.println("Starting Server");
		
		configureSSLOnTheServer();
		
		JaxWsServerFactoryBean factoryBean = new JaxWsServerFactoryBean();
		factoryBean.setServiceClass(UserServiceImpl.class);
		factoryBean.setAddress(address);
		
		Server server = factoryBean.create();
		String endpoint = server.getEndpoint().getEndpointInfo().getAddress();

		System.out.println("Server started at " + endpoint);
	}

	public static void configureSSLOnTheServer() {
		File file = new File(MyServer.class.getResource("/com/googlecode/garbagecan/cxfstudy/ssl/test.jks").getFile());
		
		try {
			TLSServerParameters tlsParams = new TLSServerParameters();
			KeyStore keyStore = KeyStore.getInstance("JKS");
			String password = "mypassword";
			String storePassword = "mypassword";
			
			keyStore.load(new FileInputStream(file), storePassword.toCharArray());
			KeyManagerFactory keyFactory = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());
			keyFactory.init(keyStore, password.toCharArray());
			KeyManager[] keyManagers = keyFactory.getKeyManagers();
			tlsParams.setKeyManagers(keyManagers);

			keyStore.load(new FileInputStream(file), storePassword.toCharArray());
			TrustManagerFactory trustFactory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
			trustFactory.init(keyStore);
			TrustManager[] trustManagers = trustFactory.getTrustManagers();
			tlsParams.setTrustManagers(trustManagers);
			
			FiltersType filtersTypes = new FiltersType();
			filtersTypes.getInclude().add(".*_EXPORT_.*");
			filtersTypes.getInclude().add(".*_EXPORT1024_.*");
			filtersTypes.getInclude().add(".*_WITH_DES_.*");
			filtersTypes.getInclude().add(".*_WITH_NULL_.*");
			filtersTypes.getExclude().add(".*_DH_anon_.*");
			tlsParams.setCipherSuitesFilter(filtersTypes);
			
			ClientAuthentication ca = new ClientAuthentication();
			ca.setRequired(true);
			ca.setWant(true);
			tlsParams.setClientAuthentication(ca);
			
			JettyHTTPServerEngineFactory factory = new JettyHTTPServerEngineFactory();
			factory.setTLSServerParametersForPort(port, tlsParams);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

}
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.     } 
package com.googlecode.garbagecan.cxfstudy.ssl;

import java.io.File;
import java.io.FileInputStream;
import java.security.KeyStore;

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.configuration.security.FiltersType;
import org.apache.cxf.endpoint.Client;
import org.apache.cxf.frontend.ClientProxy;
import org.apache.cxf.jaxws.JaxWsProxyFactoryBean;
import org.apache.cxf.transport.http.HTTPConduit;

public class MyClient {

	private static final String address = "https://localhost:12345/ws/ssl/userService";

	public static void main(String[] args) throws Exception {
		JaxWsProxyFactoryBean factoryBean = new JaxWsProxyFactoryBean();
		factoryBean.setAddress(address);
		factoryBean.setServiceClass(UserService.class);
		Object obj = factoryBean.create();
		UserService userService = (UserService) obj;
		
		configureSSLOnTheClient(userService);

		System.out.println(userService.list());
	}

	private static void configureSSLOnTheClient(Object obj) {
		File file = new File(MyServer.class.getResource("/com/googlecode/garbagecan/cxfstudy/ssl/test.jks").getFile());
		
		Client client = ClientProxy.getClient(obj);
		HTTPConduit httpConduit = (HTTPConduit) client.getConduit();

		try {
			TLSClientParameters tlsParams = new TLSClientParameters();
			tlsParams.setDisableCNCheck(true);

			KeyStore keyStore = KeyStore.getInstance("JKS");
			String password = "mypassword";
			String storePassword = "mypassword";
			
			keyStore.load(new FileInputStream(file), storePassword.toCharArray());
			TrustManagerFactory trustFactory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
			trustFactory.init(keyStore);
			TrustManager[] trustManagers = trustFactory.getTrustManagers();
			tlsParams.setTrustManagers(trustManagers);

			keyStore.load(new FileInputStream(file), storePassword.toCharArray());
			KeyManagerFactory keyFactory = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());
			keyFactory.init(keyStore, password.toCharArray());
			KeyManager[] keyManagers = keyFactory.getKeyManagers();
			tlsParams.setKeyManagers(keyManagers);
			
			FiltersType filtersTypes = new FiltersType();
			filtersTypes.getInclude().add(".*_EXPORT_.*");
			filtersTypes.getInclude().add(".*_EXPORT1024_.*");
			filtersTypes.getInclude().add(".*_WITH_DES_.*");
			filtersTypes.getInclude().add(".*_WITH_NULL_.*");
			filtersTypes.getExclude().add(".*_DH_anon_.*");
			tlsParams.setCipherSuitesFilter(filtersTypes);

			httpConduit.setTlsClientParameters(tlsParams);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}
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 
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來驗證我們的測試。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章