Author: rmannibucau
Date: Wed Jun 12 15:49:08 2013
New Revision: 1492254

URL: http://svn.apache.org/r1492254
Log:
TOMEE-974 ssl in tomee embedded

Added:
    
tomee/tomee/trunk/tomee/tomee-embedded/src/test/java/org/apache/tomee/embedded/SslTomEETest.java
Modified:
    
tomee/tomee/trunk/arquillian/arquillian-tomee-embedded/src/main/java/org/apache/openejb/arquillian/embedded/EmbeddedTomEEConfiguration.java
    
tomee/tomee/trunk/arquillian/arquillian-tomee-embedded/src/main/java/org/apache/openejb/arquillian/embedded/EmbeddedTomEEContainer.java
    
tomee/tomee/trunk/tomee/tomee-embedded/src/main/java/org/apache/tomee/embedded/Configuration.java
    
tomee/tomee/trunk/tomee/tomee-embedded/src/main/java/org/apache/tomee/embedded/Container.java

Modified: 
tomee/tomee/trunk/arquillian/arquillian-tomee-embedded/src/main/java/org/apache/openejb/arquillian/embedded/EmbeddedTomEEConfiguration.java
URL: 
http://svn.apache.org/viewvc/tomee/tomee/trunk/arquillian/arquillian-tomee-embedded/src/main/java/org/apache/openejb/arquillian/embedded/EmbeddedTomEEConfiguration.java?rev=1492254&r1=1492253&r2=1492254&view=diff
==============================================================================
--- 
tomee/tomee/trunk/arquillian/arquillian-tomee-embedded/src/main/java/org/apache/openejb/arquillian/embedded/EmbeddedTomEEConfiguration.java
 (original)
+++ 
tomee/tomee/trunk/arquillian/arquillian-tomee-embedded/src/main/java/org/apache/openejb/arquillian/embedded/EmbeddedTomEEConfiguration.java
 Wed Jun 12 15:49:08 2013
@@ -32,6 +32,79 @@ import java.util.Properties;
  */
 @Prefixes({"tomee", "tomee.embedded"})
 public class EmbeddedTomEEConfiguration extends TomEEConfiguration {
+    private int httpsPort = 8443;
+    private boolean ssl = false;
+    private String keystoreFile;
+    private String keystorePass;
+    private String keystoreType = "JKS";
+    private String clientAuth;
+    private String keyAlias;
+    private String sslProtocol;
+
+    public int getHttpsPort() {
+        return httpsPort;
+    }
+
+    public void setHttpsPort(final int httpsPort) {
+        this.httpsPort = httpsPort;
+    }
+
+    public boolean isSsl() {
+        return ssl;
+    }
+
+    public void setSsl(final boolean ssl) {
+        this.ssl = ssl;
+    }
+
+    public String getKeystoreFile() {
+        return keystoreFile;
+    }
+
+    public void setKeystoreFile(final String keystoreFile) {
+        this.keystoreFile = keystoreFile;
+    }
+
+    public String getKeystorePass() {
+        return keystorePass;
+    }
+
+    public void setKeystorePass(final String keystorePass) {
+        this.keystorePass = keystorePass;
+    }
+
+    public String getKeystoreType() {
+        return keystoreType;
+    }
+
+    public void setKeystoreType(final String keystoreType) {
+        this.keystoreType = keystoreType;
+    }
+
+    public String getClientAuth() {
+        return clientAuth;
+    }
+
+    public void setClientAuth(final String clientAuth) {
+        this.clientAuth = clientAuth;
+    }
+
+    public String getKeyAlias() {
+        return keyAlias;
+    }
+
+    public void setKeyAlias(final String keyAlias) {
+        this.keyAlias = keyAlias;
+    }
+
+    public String getSslProtocol() {
+        return sslProtocol;
+    }
+
+    public void setSslProtocol(final String sslProtocol) {
+        this.sslProtocol = sslProtocol;
+    }
+
     @Override
     public int[] portsAlreadySet() {
         final List<Integer> value = new ArrayList<Integer>();
@@ -41,6 +114,9 @@ public class EmbeddedTomEEConfiguration 
         if (getHttpPort() > 0) {
             value.add(getHttpPort());
         }
+        if (getHttpsPort() > 0) {
+            value.add(getHttpsPort());
+        }
         return toInts(value);
     }
 

Modified: 
tomee/tomee/trunk/arquillian/arquillian-tomee-embedded/src/main/java/org/apache/openejb/arquillian/embedded/EmbeddedTomEEContainer.java
URL: 
http://svn.apache.org/viewvc/tomee/tomee/trunk/arquillian/arquillian-tomee-embedded/src/main/java/org/apache/openejb/arquillian/embedded/EmbeddedTomEEContainer.java?rev=1492254&r1=1492253&r2=1492254&view=diff
==============================================================================
--- 
tomee/tomee/trunk/arquillian/arquillian-tomee-embedded/src/main/java/org/apache/openejb/arquillian/embedded/EmbeddedTomEEContainer.java
 (original)
+++ 
tomee/tomee/trunk/arquillian/arquillian-tomee-embedded/src/main/java/org/apache/openejb/arquillian/embedded/EmbeddedTomEEContainer.java
 Wed Jun 12 15:49:08 2013
@@ -61,6 +61,7 @@ public class EmbeddedTomEEContainer exte
      */
     private Configuration convertConfiguration(final 
EmbeddedTomEEConfiguration tomeeConfiguration) {
        final Configuration configuration = new Configuration();
+
        configuration.setDir(tomeeConfiguration.getDir());
        configuration.setHttpPort(tomeeConfiguration.getHttpPort());
        configuration.setStopPort(tomeeConfiguration.getStopPort());
@@ -68,6 +69,17 @@ public class EmbeddedTomEEContainer exte
         configuration.setServerXml(tomeeConfiguration.getServerXml());
         
configuration.setProperties(tomeeConfiguration.systemPropertiesAsProperties());
         configuration.setQuickSession(tomeeConfiguration.isQuickSession());
+
+        configuration.setSsl(tomeeConfiguration.isSsl());
+        configuration.setHttpsPort(tomeeConfiguration.getHttpsPort());
+        configuration.setKeystoreFile(tomeeConfiguration.getKeystoreFile());
+        configuration.setKeystorePass(tomeeConfiguration.getKeystorePass());
+        configuration.setKeyAlias(tomeeConfiguration.getKeyAlias());
+        configuration.setKeystoreType(tomeeConfiguration.getKeystoreType());
+        configuration.setClientAuth(tomeeConfiguration.getClientAuth());
+        configuration.setKeyAlias(tomeeConfiguration.getKeyAlias());
+        configuration.setSslProtocol(tomeeConfiguration.getSslProtocol());
+
                return configuration;
        }
 

Modified: 
tomee/tomee/trunk/tomee/tomee-embedded/src/main/java/org/apache/tomee/embedded/Configuration.java
URL: 
http://svn.apache.org/viewvc/tomee/tomee/trunk/tomee/tomee-embedded/src/main/java/org/apache/tomee/embedded/Configuration.java?rev=1492254&r1=1492253&r2=1492254&view=diff
==============================================================================
--- 
tomee/tomee/trunk/tomee/tomee-embedded/src/main/java/org/apache/tomee/embedded/Configuration.java
 (original)
+++ 
tomee/tomee/trunk/tomee/tomee-embedded/src/main/java/org/apache/tomee/embedded/Configuration.java
 Wed Jun 12 15:49:08 2013
@@ -31,6 +31,16 @@ public class Configuration {
     private File serverXml = null;
     private Properties properties;
     private boolean quickSession = true;
+    private boolean skipHttp = false;
+
+    private int httpsPort = 8443;
+    private boolean ssl = false;
+    private String keystoreFile;
+    private String keystorePass;
+    private String keystoreType = "JKS";
+    private String clientAuth;
+    private String keyAlias;
+    private String sslProtocol;
 
     public int getHttpPort() {
         return httpPort;
@@ -60,10 +70,58 @@ public class Configuration {
         return host;
     }
 
+    public int getHttpsPort() {
+        return httpsPort;
+    }
+
+    public void setHttpsPort(int httpsPort) {
+        this.httpsPort = httpsPort;
+    }
+
     public void setHost(String host) {
         this.host = host;
     }
 
+    public String getKeystoreFile() {
+        return keystoreFile;
+    }
+
+    public void setKeystoreFile(final String keystoreFile) {
+        this.keystoreFile = keystoreFile;
+    }
+
+    public String getKeystorePass() {
+        return keystorePass;
+    }
+
+    public void setKeystorePass(final String keystorePass) {
+        this.keystorePass = keystorePass;
+    }
+
+    public String getKeystoreType() {
+        return keystoreType;
+    }
+
+    public void setKeystoreType(final String keystoreType) {
+        this.keystoreType = keystoreType;
+    }
+
+    public String getClientAuth() {
+        return clientAuth;
+    }
+
+    public void setClientAuth(final String clientAuth) {
+        this.clientAuth = clientAuth;
+    }
+
+    public String getKeyAlias() {
+        return keyAlias;
+    }
+
+    public void setKeyAlias(final String keyAlias) {
+        this.keyAlias = keyAlias;
+    }
+
     public void setServerXml(String file) {
         if (file == null) {
             serverXml = null;
@@ -95,7 +153,31 @@ public class Configuration {
         return quickSession;
     }
 
+    public boolean isSsl() {
+        return ssl;
+    }
+
+    public void setSsl(final boolean ssl) {
+        this.ssl = ssl;
+    }
+
+    public boolean isSkipHttp() {
+        return skipHttp;
+    }
+
+    public void setSkipHttp(final boolean skipHttp) {
+        this.skipHttp = skipHttp;
+    }
+
     public void setQuickSession(boolean quickSession) {
         this.quickSession = quickSession;
     }
+
+    public String getSslProtocol() {
+        return sslProtocol;
+    }
+
+    public void setSslProtocol(final String sslProtocol) {
+        this.sslProtocol = sslProtocol;
+    }
 }

Modified: 
tomee/tomee/trunk/tomee/tomee-embedded/src/main/java/org/apache/tomee/embedded/Container.java
URL: 
http://svn.apache.org/viewvc/tomee/tomee/trunk/tomee/tomee-embedded/src/main/java/org/apache/tomee/embedded/Container.java?rev=1492254&r1=1492253&r2=1492254&view=diff
==============================================================================
--- 
tomee/tomee/trunk/tomee/tomee-embedded/src/main/java/org/apache/tomee/embedded/Container.java
 (original)
+++ 
tomee/tomee/trunk/tomee/tomee-embedded/src/main/java/org/apache/tomee/embedded/Container.java
 Wed Jun 12 15:49:08 2013
@@ -42,6 +42,7 @@ import org.apache.openejb.loader.Files;
 import org.apache.openejb.loader.IO;
 import org.apache.openejb.loader.SystemInstance;
 import org.apache.openejb.spi.ContainerSystem;
+import org.apache.openejb.util.LogCategory;
 import org.apache.openejb.util.Logger;
 import org.apache.tomee.catalina.TomEERuntimeException;
 import org.apache.tomee.catalina.TomcatLoader;
@@ -67,17 +68,16 @@ import java.util.Properties;
  * @version $Rev$ $Date$
  */
 public class Container {
-
     static {
         // org.apache.naming
         Assembler.installNaming("org.apache.naming", true);
     }
 
-    protected Configuration configuration;
-    private File base;
     private final Map<String, String> moduleIds = new HashMap<String, 
String>(); // TODO: manage multimap
     private final Map<String, AppContext> appContexts = new HashMap<String, 
AppContext>(); // TODO: manage multimap
     private final Map<String, AppInfo> infos = new HashMap<String, AppInfo>(); 
// TODO: manage multimap
+    protected Configuration configuration;
+    private File base;
     private ConfigurationFactory configurationFactory;
     private Assembler assembler;
     private Tomcat tomcat;
@@ -88,6 +88,25 @@ public class Container {
         configuration.setStopPort(23881);
     }
 
+    private static boolean sameApplication(final File file, final WebAppInfo 
webApp) {
+        String filename = file.getName();
+        if (filename.endsWith(".war")) {
+            filename = filename.substring(0, filename.length() - 4);
+        }
+        return filename.equals(webApp.moduleId);
+    }
+
+    private static String lastPart(final String name, final String 
defaultValue) {
+        final int idx = name.lastIndexOf("/");
+        final int space = name.lastIndexOf(" ");
+        if (idx >= 0 && space < idx) {
+            return name.substring(idx);
+        } else if (idx < 0 && space < 0) {
+            return name;
+        }
+        return defaultValue;
+    }
+
     public void setup(final Configuration configuration) {
         this.configuration = configuration;
 
@@ -169,18 +188,46 @@ public class Container {
         // Trigger loading of catalina.properties
         CatalinaProperties.getProperty("foo");
 
-        final Connector connector = new 
Connector(Http11Protocol.class.getName());
-        connector.setPort(configuration.getHttpPort());
-        connector.setAttribute("connectionTimeout", "3000");
-        tomcat.getService().addConnector(connector);
-        tomcat.setConnector(connector);
         tomcat.setBaseDir(base.getAbsolutePath());
         tomcat.getHost().setAppBase(webapps.getAbsolutePath());
         tomcat.setHostname(configuration.getHost());
         tomcat.getEngine().setDefaultHost(configuration.getHost());
 
+        if (!configuration.isSkipHttp()) {
+            final Connector connector = new 
Connector(Http11Protocol.class.getName());
+            connector.setPort(configuration.getHttpPort());
+            connector.setAttribute("connectionTimeout", "3000");
+            tomcat.getService().addConnector(connector);
+            tomcat.setConnector(connector);
+        }
+
+        // create https connector
+        if (configuration.isSsl()) {
+            Connector httpsConnector = new 
Connector(Http11Protocol.class.getName());
+            httpsConnector.setPort(configuration.getHttpsPort());
+            httpsConnector.setSecure(true);
+            httpsConnector.setProperty("SSLEnabled", "true");
+            httpsConnector.setProperty("sslProtocol", 
configuration.getSslProtocol());
+
+            if (configuration.getKeystoreFile() != null) {
+                httpsConnector.setAttribute("keystoreFile", 
configuration.getKeystoreFile());
+            }
+            if (configuration.getKeystorePass() != null) {
+                httpsConnector.setAttribute("keystorePass", 
configuration.getKeystorePass());
+            }
+            httpsConnector.setAttribute("keystoreType", 
configuration.getKeystoreType());
+            httpsConnector.setAttribute("clientAuth", 
configuration.getClientAuth());
+            httpsConnector.setAttribute("keyAlias", 
configuration.getKeyAlias());
+
+            tomcat.getService().addConnector(httpsConnector);
+
+            if (configuration.isSkipHttp()) {
+                tomcat.setConnector(httpsConnector);
+            }
+        }
+
         // Bootstrap Tomcat
-        System.out.println("Starting TomEE from: " + base.getAbsolutePath());
+        Logger.getInstance(LogCategory.OPENEJB_STARTUP, 
Container.class).info("Starting TomEE from: " + base.getAbsolutePath()); // 
create it after Logger is configured
 
         final String catalinaBase = base.getAbsolutePath();
         System.setProperty("openejb.deployments.classpath", "false");
@@ -192,10 +239,6 @@ public class Container {
 
         tomcat.start();
 
-
-//        bootstrap = new Bootstrap();
-//        bootstrap.start();
-
         // Bootstrap OpenEJB
         final Properties properties = new Properties();
         properties.setProperty("openejb.deployments.classpath", "false");
@@ -351,25 +394,6 @@ public class Container {
         return context;
     }
 
-    private static boolean sameApplication(final File file, final WebAppInfo 
webApp) {
-        String filename = file.getName();
-        if (filename.endsWith(".war")) {
-            filename = filename.substring(0, filename.length() - 4);
-        }
-        return filename.equals(webApp.moduleId);
-    }
-
-    private static String lastPart(final String name, final String 
defaultValue) {
-        final int idx = name.lastIndexOf("/");
-        final int space = name.lastIndexOf(" ");
-        if (idx >= 0 && space < idx) {
-            return name.substring(idx);
-        } else if (idx < 0 && space < 0) {
-            return name;
-        }
-        return defaultValue;
-    }
-
     @SuppressWarnings("UnusedDeclaration")
     public AppInfo getInfo(final String name) {
         return infos.get(name);

Added: 
tomee/tomee/trunk/tomee/tomee-embedded/src/test/java/org/apache/tomee/embedded/SslTomEETest.java
URL: 
http://svn.apache.org/viewvc/tomee/tomee/trunk/tomee/tomee-embedded/src/test/java/org/apache/tomee/embedded/SslTomEETest.java?rev=1492254&view=auto
==============================================================================
--- 
tomee/tomee/trunk/tomee/tomee-embedded/src/test/java/org/apache/tomee/embedded/SslTomEETest.java
 (added)
+++ 
tomee/tomee/trunk/tomee/tomee-embedded/src/test/java/org/apache/tomee/embedded/SslTomEETest.java
 Wed Jun 12 15:49:08 2013
@@ -0,0 +1,85 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ */
+package org.apache.tomee.embedded;
+
+import org.apache.openejb.loader.Files;
+import org.junit.Test;
+
+import javax.management.ObjectName;
+import java.io.File;
+import java.lang.management.ManagementFactory;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+
+public class SslTomEETest {
+    @Test
+    public void test() throws Exception {
+        final File keystore = new File("target/keystore");
+
+        {   // generate keystore/trustore
+            if (keystore.exists()) {
+                Files.delete(keystore);
+            }
+
+            Class<?> keyToolClass;
+            try {
+                keyToolClass = Class.forName("sun.security.tools.KeyTool");
+            } catch (final ClassNotFoundException e) {
+                keyToolClass = Class.forName("com.ibm.crypto.tools.KeyTool");
+            }
+
+            final String[] args = {
+                    "-genkey",
+                    "-alias", "serveralias",
+                    "-keypass", "changeit",
+                    "-keystore", keystore.getAbsolutePath(),
+                    "-storepass", "changeit",
+                    "-dname", "cn=serveralias",
+                    "-keyalg", "RSA"
+            };
+            keyToolClass.getMethod("main", String[].class).invoke(null, new 
Object[]{args});
+        }
+
+        final Configuration configuration = new Configuration();
+        configuration.setSsl(true);
+        configuration.setKeystoreFile(keystore.getAbsolutePath());
+        configuration.setKeystorePass("changeit");
+        configuration.setKeyAlias("serveralias");
+
+        final Container container = new Container();
+        container.setup(configuration);
+        container.start();
+
+        try {
+            assertEquals(8443, 
ManagementFactory.getPlatformMBeanServer().getAttribute(new 
ObjectName("Tomcat:type=ProtocolHandler,port=8443"), "port"));
+        } finally {
+            container.stop();
+        }
+
+        // ensure it is not always started
+        configuration.setSsl(false);
+        container.setup(configuration);
+        container.start();
+        try {
+            
assertFalse(ManagementFactory.getPlatformMBeanServer().isRegistered(new 
ObjectName("Tomcat:type=ProtocolHandler,port=8443")));
+        } finally {
+            container.stop();
+        }
+
+    }
+}


Reply via email to