You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@uima.apache.org by de...@apache.org on 2016/06/17 14:06:45 UTC

svn commit: r1748861 - in /uima/uima-ducc/trunk: src/main/admin/ducc_post_install uima-ducc-web/src/main/java/org/apache/uima/ducc/ws/server/DuccWebServer.java uima-ducc-web/src/main/java/org/apache/uima/ducc/ws/server/DuccWebServerHelper.java

Author: degenaro
Date: Fri Jun 17 14:06:44 2016
New Revision: 1748861

URL: http://svn.apache.org/viewvc?rev=1748861&view=rev
Log:
UIMA-4730 Update Web Server (WS) to properly employ https with the new Jetty

Modified:
    uima/uima-ducc/trunk/src/main/admin/ducc_post_install
    uima/uima-ducc/trunk/uima-ducc-web/src/main/java/org/apache/uima/ducc/ws/server/DuccWebServer.java
    uima/uima-ducc/trunk/uima-ducc-web/src/main/java/org/apache/uima/ducc/ws/server/DuccWebServerHelper.java

Modified: uima/uima-ducc/trunk/src/main/admin/ducc_post_install
URL: http://svn.apache.org/viewvc/uima/uima-ducc/trunk/src/main/admin/ducc_post_install?rev=1748861&r1=1748860&r2=1748861&view=diff
==============================================================================
--- uima/uima-ducc/trunk/src/main/admin/ducc_post_install (original)
+++ uima/uima-ducc/trunk/src/main/admin/ducc_post_install Fri Jun 17 14:06:44 2016
@@ -221,9 +221,9 @@ class PostInstall():
             rc = os.system(cmd);
 
         self.default_keystore_prop.v = reply
-        print 'keystore created as', reply
-            
-
+        print 'keystore = ', keystore
+        #print 'keypass = ', reply
+        #print 'storepass = ', reply
     # Setup and verify amq
     # make sure verify_ducc is sufficient - maybe move some checks to there?
 

Modified: uima/uima-ducc/trunk/uima-ducc-web/src/main/java/org/apache/uima/ducc/ws/server/DuccWebServer.java
URL: http://svn.apache.org/viewvc/uima/uima-ducc/trunk/uima-ducc-web/src/main/java/org/apache/uima/ducc/ws/server/DuccWebServer.java?rev=1748861&r1=1748860&r2=1748861&view=diff
==============================================================================
--- uima/uima-ducc/trunk/uima-ducc-web/src/main/java/org/apache/uima/ducc/ws/server/DuccWebServer.java (original)
+++ uima/uima-ducc/trunk/uima-ducc-web/src/main/java/org/apache/uima/ducc/ws/server/DuccWebServer.java Fri Jun 17 14:06:44 2016
@@ -35,10 +35,13 @@ import org.apache.uima.ducc.common.utils
 import org.apache.uima.ducc.ws.DuccPlugins;
 import org.eclipse.jetty.server.Connector;
 import org.eclipse.jetty.server.Handler;
+import org.eclipse.jetty.server.HttpConfiguration;
 import org.eclipse.jetty.server.HttpConnectionFactory;
 import org.eclipse.jetty.server.NCSARequestLog;
+import org.eclipse.jetty.server.SecureRequestCustomizer;
 import org.eclipse.jetty.server.Server;
 import org.eclipse.jetty.server.ServerConnector;
+import org.eclipse.jetty.server.SslConnectionFactory;
 import org.eclipse.jetty.server.handler.DefaultHandler;
 import org.eclipse.jetty.server.handler.HandlerList;
 import org.eclipse.jetty.server.handler.RequestLogHandler;
@@ -87,14 +90,6 @@ public class DuccWebServer {
 		  }
 	 }
 	
-	
-	/**
-	 * The default port can be overridden in ducc.properties file, for example:
-	 * 		ducc.ws.port = 41233
-	 */
-	//private int port = 42133;
-	//private String ipaddress = null;
-	
 	/**
 	 * To support https, do the following:
 	 * 
@@ -102,23 +97,12 @@ public class DuccWebServer {
 	 *    keystore in ducc_web/etc directory
 	 * 2. in ducc.properties set SSL port, for example:
 	 * 		ducc.ws.port.ssl = 42155
-	 * 3. in ducc.properties set SSL password, for example:
-     * 		ducc.ws.port.ssl.pw = quackquack
-     *       
-     * Note: if SSL port is not set in ducc.properties, the webserver will not create
-     *       the SSL connection, and thus secure communications will be unsupported.
 	 */
-	private int portSsl = -1;
-	private String portSslPw = "quackquack";
-	private String rootDir = "?";
-
-	//
 	
+	private String rootDir = "?";
 	private Server server;
-	
 	private CommonConfiguration commonConfiguration;
 	
-	
 	public DuccWebServer(CommonConfiguration commonConfiguration) {
 		this.commonConfiguration = commonConfiguration;
 		init();
@@ -141,12 +125,22 @@ public class DuccWebServer {
 	}
 	
 	public int getPortSsl() {
-		return portSsl;
+		String property = DuccPropertiesResolver.get(DuccPropertiesResolver.ducc_ws_port_https);
+        int portHttps = ConfigValue.PortHttps.getInt(property);
+        return portHttps;
 	}
 	
 	public String getRootDir() {
 		return rootDir;
 	}
+
+	public String getKeyStorePassword() {
+		return DuccWebServerHelper.getKeyStorePassword();
+	}
+
+	public String getKeyManagerPassword() {
+		return DuccWebServerHelper.getKeyManagerPassword();
+	}
 	
 	private void init() {
 		String methodName = "init";
@@ -154,102 +148,92 @@ public class DuccWebServer {
 		logger.info(methodName, null, messages.fetchLabel("cluster name")+getClusterName());
 		logger.info(methodName, null, messages.fetchLabel("class definition file")+getClassDefinitionFile());
 		
-		 String property;
+		String property;
 
-         /**                                                                                                                                                        
-          * Determine server idle timeout                                                                                                                           
-          * ducc.ws.idle.timeout                                                                                                                                    
-          */
-         property = DuccPropertiesResolver.get(DuccPropertiesResolver.ducc_ws_idle_timeout);
-         int idleTimeout = ConfigValue.IdleTimeout.getInt(property);
+        /**                                                                                                                                                        
+         * Determine server idle timeout                                                                                                                           
+         * ducc.ws.idle.timeout                                                                                                                                    
+         */
+        property = DuccPropertiesResolver.get(DuccPropertiesResolver.ducc_ws_idle_timeout);
+        int idleTimeout = ConfigValue.IdleTimeout.getInt(property);
 
-         /**                                                                                                                                                        
-          * Determine server max threads                                                                                                                            
-          * ducc.ws.max.threads                                                                                                                                     
-          */
-         property = DuccPropertiesResolver.get(DuccPropertiesResolver.ducc_ws_max_threads);
-         int maxThreads = ConfigValue.MaxThreads.getInt(property);
+        /**                                                                                                                                                        
+         * Determine server max threads                                                                                                                            
+         * ducc.ws.max.threads                                                                                                                                     
+         */
+        property = DuccPropertiesResolver.get(DuccPropertiesResolver.ducc_ws_max_threads);
+        int maxThreads = ConfigValue.MaxThreads.getInt(property);
 
-         /**                                                                                                                                                        
-          * Determine server http port                                                                                                                              
-          * ducc.ws.port                                                                                                                                            
-          */
-         property = DuccPropertiesResolver.get(DuccPropertiesResolver.ducc_ws_port);
-         int portHttp = ConfigValue.PortHttp.getInt(property);
+        /**                                                                                                                                                        
+         * Determine server http port                                                                                                                              
+         * ducc.ws.port                                                                                                                                            
+         */
+        property = DuccPropertiesResolver.get(DuccPropertiesResolver.ducc_ws_port);
+        int portHttp = ConfigValue.PortHttp.getInt(property);
 
         /**                                                                                                                                                        
           * Determine server https port                                                                                                                             
           * ducc.ws.port.https                                                                                                                                      
           */
-         property = DuccPropertiesResolver.get(DuccPropertiesResolver.ducc_ws_port_https);
-         int portHttps = ConfigValue.PortHttps.getInt(property);
-
-         try {
-                 InetAddress inetAddress = InetAddress.getLocalHost();
-                 String host = inetAddress.getCanonicalHostName();
-                 DuccWebMonitor.getInstance().register(host, ""+portHttp);
-         }
-         catch(Exception e) {
-                 logger.error(methodName, jobid, e);
-         }
-
-         // === jetty.xml ===                                                                                                                                       
-
-         // Setup Threadpool                                                                                                                                        
-         QueuedThreadPool threadPool = new QueuedThreadPool();
-         threadPool.setMaxThreads(maxThreads);
-
-         // Server                                                                                                                                                          
-         server = new Server(threadPool);
-
-         // Scheduler                                                                                                                                                       
-         server.addBean(new ScheduledExecutorScheduler());
-
-         // === jetty-http.xml ===                                                                                                                                          
-         ServerConnector http = new ServerConnector(server, new HttpConnectionFactory());
-         http.setPort(portHttp);
-         http.setIdleTimeout(idleTimeout);
-         server.addConnector(http);
-
-         // === jetty-https.xml ===                                                                                                                                         
-         // SSL Context Factory                                                                                                                                             
-         SslContextFactory sslContextFactory = new SslContextFactory();
-         String keystore = DuccWebServerHelper.getDuccWebKeyStore();
+        property = DuccPropertiesResolver.get(DuccPropertiesResolver.ducc_ws_port_https);
+        int portHttps = ConfigValue.PortHttps.getInt(property);
 
+        try {
+        	InetAddress inetAddress = InetAddress.getLocalHost();
+            String host = inetAddress.getCanonicalHostName();
+            DuccWebMonitor.getInstance().register(host, ""+portHttp);
+        }
+        catch(Exception e) {
+            logger.error(methodName, jobid, e);
+        }
 
+        // === jetty.xml ===                                                                                                                                       
 
+        // Setup Threadpool                                                                                                                                        
+        QueuedThreadPool threadPool = new QueuedThreadPool();
+        threadPool.setMaxThreads(maxThreads);
+
+        // Server                                                                                                                                                          
+        server = new Server(threadPool);
+
+        // Scheduler                                                                                                                                                       
+        server.addBean(new ScheduledExecutorScheduler());
+
+        // === jetty-http.xml ===                                                                                                                                          
+        ServerConnector http = new ServerConnector(server, new HttpConnectionFactory());
+        http.setPort(portHttp);
+        http.setIdleTimeout(idleTimeout);
+        server.addConnector(http);
+
+        // === jetty-https.xml ===                                                                                                                                         
+        // SSL Context Factory                                                                                                                                             
+        SslContextFactory sslContextFactory = new SslContextFactory();
+        String keystore = DuccWebServerHelper.getDuccWebKeyStore();
+
+        logger.info(methodName, jobid, "keystore="+keystore);
+        HttpConfiguration http_config = new HttpConfiguration();
+ 		http_config.setSecureScheme("https");
+ 		http_config.setSecurePort(portHttps);
+ 		logger.info(methodName, jobid, "portHttps="+portHttps);
+        HttpConfiguration https_config = new HttpConfiguration(http_config);
+        https_config.addCustomizer(new SecureRequestCustomizer());
          
+        ServerConnector https = new ServerConnector(server,
+             new SslConnectionFactory(sslContextFactory,"http/1.1"),
+             new HttpConnectionFactory(https_config));
+
+        https.setPort(portHttps);
+        sslContextFactory.setKeyStorePath(keystore);
+        String pw = getKeyStorePassword();
+        logger.trace(methodName, jobid, "pw="+pw);
+        sslContextFactory.setKeyStorePassword(getKeyStorePassword());    
+        sslContextFactory.setKeyManagerPassword(getKeyManagerPassword());
+        
+        server.setConnectors(new Connector[] { http });
+        server.addConnector(https);
+        
+        // JSP
          
-         
-         
-         /*
-         
-		server = new Server();
-		SelectChannelConnector connector0 = new SelectChannelConnector();
-        connector0.setPort(port);
-        if(ipaddress != null) {
-        	connector0.setHost(ipaddress);
-        }
-        if(portSsl < 0) {
-        	server.setConnectors(new Connector[]{ connector0 });
-        }
-        else {
-        	SslSelectChannelConnector ssl_connector = new SslSelectChannelConnector();
-        	ssl_connector.setPort(portSsl);
-        	if(ipaddress != null) {
-            	ssl_connector.setHost(ipaddress);
-            }
-        	org.eclipse.jetty.util.ssl.SslContextFactory cf = ssl_connector.getSslContextFactory();
-        	//SslContextFactory cf = ssl_connector.getSslContextFactory();
-        	String keystore = DuccWebServerHelper.getDuccWebKeyStore();
-        	logger.info(methodName, null, "keystore:"+keystore);
-        	cf.setKeyStorePath(keystore);
-        //	cf.setKeyStore(keystore);
-        	cf.setKeyStorePassword(portSslPw);
-        	server.setConnectors(new Connector[]{ connector0, ssl_connector });
-        }
-        */
-        //
         ServletContextHandler jspHandler = new ServletContextHandler(ServletContextHandler.SESSIONS);
         jspHandler.setContextPath("/");
         jspHandler.setResourceBase("root");
@@ -258,13 +242,13 @@ public class DuccWebServer {
         ServletHolder jsp = jspHandler.addServlet(JspServlet.class, "*.jsp");
         jsp.setInitParameter("classpath", jspHandler.getClassPath());
         //
-		ResourceHandler resourceHandler = new ResourceHandler();
-		resourceHandler.setDirectoriesListed(true);
-		resourceHandler.setWelcomeFiles(new String[]{ "index.html" });
-		rootDir = DuccWebServerHelper.getDuccWebRoot();
-		resourceHandler.setResourceBase(rootDir);
-		//
-		try {
+        ResourceHandler resourceHandler = new ResourceHandler();
+        resourceHandler.setDirectoriesListed(true);
+        resourceHandler.setWelcomeFiles(new String[]{ "index.html" });
+        rootDir = DuccWebServerHelper.getDuccWebRoot();
+        resourceHandler.setResourceBase(rootDir);
+        //
+        try {
 			Properties properties = DuccWebProperties.get();
 			String ducc_runmode = properties.getProperty("ducc.runmode","Production");
 			logger.debug(methodName, null, "ducc.runmode:"+ducc_runmode);
@@ -285,18 +269,18 @@ public class DuccWebServer {
 			out.println(text);
 			out.flush();
 			out.close();
-		}
-		catch(Exception e) {
+        }
+        catch(Exception e) {
 			logger.info(methodName, null, e);
-		}
-		//
-		HandlerList handlers = new HandlerList();
+        }
+        //
+        HandlerList handlers = new HandlerList();
 		
-		String key = "ducc.ws.requestLog.RetainDays";
-		int dflt = 0;
-		int requestLogRetainDays = DuccPropertiesResolver.get(key, dflt);
-		logger.info(methodName, jobid, "requestLogRetainDays="+requestLogRetainDays);
-		if(requestLogRetainDays > 0) {
+        String key = "ducc.ws.requestLog.RetainDays";
+        int dflt = 0;
+        int requestLogRetainDays = DuccPropertiesResolver.get(key, dflt);
+        logger.info(methodName, jobid, "requestLogRetainDays="+requestLogRetainDays);
+        if(requestLogRetainDays > 0) {
 			String requestLogTimeZone = "GMT";
 			String requestLogFmt = "yyyy_MM_dd";
 			String requestLogFile = IDuccEnv.DUCC_LOGS_WEBSERVER_DIR+requestLogFmt+".request.log";
@@ -312,32 +296,32 @@ public class DuccWebServer {
 		    requestLogHandler.setRequestLog(requestLog);
 		    handlers.addHandler(requestLogHandler);
 		    logger.info(methodName, jobid, "requestLogFile="+requestLogFile);
-		}
+        }
 		
-		DuccHandler duccHandler = new DuccHandler(this);
-		ArrayList<Handler> localHandlers = DuccPlugins.getInstance().gethandlers(this);
-		DuccHandlerClassic duccHandlerClassic = new DuccHandlerClassic(this);
-		DuccHandlerJsonFormat duccHandlerJson = new DuccHandlerJsonFormat(this);
-		DuccHandlerProxy duccHandlerProxy = new DuccHandlerProxy();
-		DuccHandlerViz duccHandlerViz = new DuccHandlerViz();
-		DuccHandlerUserAuthentication duccHandlerUserAuthentication = new DuccHandlerUserAuthentication();
-		SessionHandler sessionHandler = new SessionHandler();
-		handlers.addHandler(sessionHandler);
-		handlers.addHandler(duccHandlerUserAuthentication);
-		for(Handler handler: localHandlers) {
-			handlers.addHandler(handler);
-		}
-		handlers.addHandler(duccHandlerJson);
-		handlers.addHandler(duccHandlerProxy);
-		handlers.addHandler(duccHandlerClassic);
-		handlers.addHandler(duccHandlerViz);
-		handlers.addHandler(duccHandler);
-		handlers.addHandler(jspHandler);
-		handlers.addHandler(resourceHandler);
-		handlers.addHandler(new DefaultHandler());
-		server.setHandler(handlers);
+        DuccHandler duccHandler = new DuccHandler(this);
+        ArrayList<Handler> localHandlers = DuccPlugins.getInstance().gethandlers(this);
+        DuccHandlerClassic duccHandlerClassic = new DuccHandlerClassic(this);
+        DuccHandlerJsonFormat duccHandlerJson = new DuccHandlerJsonFormat(this);
+        DuccHandlerProxy duccHandlerProxy = new DuccHandlerProxy();
+        DuccHandlerViz duccHandlerViz = new DuccHandlerViz();
+        DuccHandlerUserAuthentication duccHandlerUserAuthentication = new DuccHandlerUserAuthentication();
+        SessionHandler sessionHandler = new SessionHandler();
+        handlers.addHandler(sessionHandler);
+        handlers.addHandler(duccHandlerUserAuthentication);
+        for(Handler handler: localHandlers) {
+        	handlers.addHandler(handler);
+        }
+        handlers.addHandler(duccHandlerJson);
+        handlers.addHandler(duccHandlerProxy);
+        handlers.addHandler(duccHandlerClassic);
+        handlers.addHandler(duccHandlerViz);
+        handlers.addHandler(duccHandler);
+        handlers.addHandler(jspHandler);
+        handlers.addHandler(resourceHandler);
+        handlers.addHandler(new DefaultHandler());
+        server.setHandler(handlers);
 		
-		logger.trace(methodName, null, messages.fetch("exit"));
+        logger.trace(methodName, null, messages.fetch("exit"));
 	}
 	
 	public void start() throws Exception {

Modified: uima/uima-ducc/trunk/uima-ducc-web/src/main/java/org/apache/uima/ducc/ws/server/DuccWebServerHelper.java
URL: http://svn.apache.org/viewvc/uima/uima-ducc/trunk/uima-ducc-web/src/main/java/org/apache/uima/ducc/ws/server/DuccWebServerHelper.java?rev=1748861&r1=1748860&r2=1748861&view=diff
==============================================================================
--- uima/uima-ducc/trunk/uima-ducc-web/src/main/java/org/apache/uima/ducc/ws/server/DuccWebServerHelper.java (original)
+++ uima/uima-ducc/trunk/uima-ducc-web/src/main/java/org/apache/uima/ducc/ws/server/DuccWebServerHelper.java Fri Jun 17 14:06:44 2016
@@ -24,6 +24,7 @@ import java.io.FileNotFoundException;
 import java.io.IOException;
 import java.util.Properties;
 
+import org.apache.uima.ducc.common.IDuccEnv;
 import org.apache.uima.ducc.common.utils.DuccLogger;
 import org.apache.uima.ducc.common.utils.DuccLoggerComponents;
 import org.apache.uima.ducc.common.utils.id.DuccId;
@@ -66,9 +67,42 @@ public class DuccWebServerHelper {
 		return rootDir;
 	}
 	
+	/**
+	 * retrieve keystore pw from resources.private/ducc.private.properties
+	 */
+	public static String getKeyStorePassword() {
+		String location = "getKeyStorePassword";
+		String retVal = null;
+		String pwDir = IDuccEnv.DUCC_HOME_DIR+"resources.private";
+		String fileName = pwDir+File.separator+"ducc.private.properties";
+		try {
+			File file = new File(fileName);
+			FileInputStream fis = new FileInputStream(file);
+			Properties properties = new Properties();
+			properties.load(fis);
+			fis.close();
+			String key = "ducc.ws.port.ssl.pw";
+			retVal = properties.getProperty(key);
+		}
+		catch (FileNotFoundException e) {
+			logger.debug(location, jobid, fileName+" not found");
+		} 
+		catch (IOException e) {
+			logger.debug(location, jobid, fileName+" load error");
+		}
+		return retVal;
+	}
+	
+	public static String getKeyManagerPassword() {
+		return getKeyStorePassword();
+	}
+	
+	/**
+	 * formulate file path to keystore (used for https)
+	 */
 	public static String getDuccWebKeyStore() {
-		String rootDir = getDuccWeb()+File.separator+"etc"+File.separator+"keystore";
-		return rootDir;
+		String retVal = IDuccEnv.DUCC_HOME_DIR+"webserver"+File.separator+"etc"+File.separator+"keystore";
+		return retVal;
 	}
 	
 	private static boolean exists(String fileName) {