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();
+ }
+
+ }
+}