diff --git a/src/java/org/jivesoftware/multiplexer/ConnectionManager.java b/src/java/org/jivesoftware/multiplexer/ConnectionManager.java index ac3d9a7..93eee10 100644 --- a/src/java/org/jivesoftware/multiplexer/ConnectionManager.java +++ b/src/java/org/jivesoftware/multiplexer/ConnectionManager.java @@ -339,7 +339,7 @@ } catch (Exception e) { httpBindManager = null; - System.err.println("Error starting http bind servlet " + plainPort + "and" + sslPort + System.err.println("Error starting http bind servlet " + plainPort + " and " + sslPort + ": " + e.getMessage()); Log.error(LocaleUtils.getLocalizedString("admin.error.http.bind"), e); } diff --git a/src/java/org/jivesoftware/multiplexer/net/SSLConfig.java b/src/java/org/jivesoftware/multiplexer/net/SSLConfig.java index 732975c..7e66780 100644 --- a/src/java/org/jivesoftware/multiplexer/net/SSLConfig.java +++ b/src/java/org/jivesoftware/multiplexer/net/SSLConfig.java @@ -38,13 +38,14 @@ private static String trustpass; private static String keyStoreLocation; private static String trustStoreLocation; + private static String storeType; private SSLConfig() { } static { String algorithm = JiveGlobals.getXMLProperty("xmpp.socket.ssl.algorithm", "TLS"); - String storeType = JiveGlobals.getXMLProperty("xmpp.socket.ssl.storeType", "jks"); + storeType = JiveGlobals.getXMLProperty("xmpp.socket.ssl.storeType", "jks"); // Get the keystore location. The default location is security/keystore keyStoreLocation = JiveGlobals.getXMLProperty("xmpp.socket.ssl.keystore", @@ -153,4 +154,20 @@ return sslFactory.createServerSocket(port, -1, ifAddress); } } + + public static String getKeystoreLocation() { + return keyStoreLocation; + } + + public static String getTruststoreLocation() { + return trustStoreLocation; + } + + public static String getStoreType() { + return storeType; + } + + public static SSLJiveServerSocketFactory getServerSocketFactory() { + return sslFactory; + } } \ No newline at end of file diff --git a/src/java/org/jivesoftware/multiplexer/net/http/HttpBindManager.java b/src/java/org/jivesoftware/multiplexer/net/http/HttpBindManager.java index d4a78d7..e7c503f 100644 --- a/src/java/org/jivesoftware/multiplexer/net/http/HttpBindManager.java +++ b/src/java/org/jivesoftware/multiplexer/net/http/HttpBindManager.java @@ -12,14 +12,20 @@ import org.mortbay.jetty.Server; import org.mortbay.jetty.Connector; +import org.mortbay.jetty.Handler; +import org.mortbay.jetty.security.SslSocketConnector; import org.mortbay.jetty.servlet.ServletHolder; import org.mortbay.jetty.servlet.ServletHandler; import org.mortbay.jetty.nio.SelectChannelConnector; +import org.jivesoftware.multiplexer.net.SSLConfig; +import org.jivesoftware.util.Log; + +import javax.net.ssl.SSLServerSocketFactory; /** - * Manages connections to the server which use the HTTP Bind protocol specified in - * XEP-0124. The manager maps a servlet - * to an embedded servlet container using the ports provided in the constructor. + * Manages connections to the server which use the HTTP Bind protocol specified in XEP-0124. The manager maps a servlet to + * an embedded servlet container using the ports provided in the constructor. * * @author Alexander Wenckus */ @@ -42,17 +48,49 @@ * @throws Exception if there is an error starting up the server. */ public void startup() throws Exception { - SelectChannelConnector connector = new SelectChannelConnector(); - connector.setPort(plainPort); - server.setConnectors(new Connector[]{connector}); + for(Connector connector : createConnectors()) { + server.addConnector(connector); + } + server.addHandler(createServletHandler()); + server.start(); + } + + private Handler createServletHandler() { ServletHolder servletHolder = new ServletHolder( new HttpBindServlet(new HttpSessionManager(serverName))); ServletHandler servletHandler = new ServletHandler(); servletHandler.addServletWithMapping(servletHolder, "/"); - server.addHandler(servletHandler); + return servletHandler; + } - server.start(); + private Connector[] createConnectors() { + SelectChannelConnector connector = new SelectChannelConnector(); + connector.setPort(plainPort); + + if (sslPort > 0) { + try { + SslSocketConnector secureConnector = new JiveSslConnector(); + secureConnector.setPort(sslPort); + + secureConnector.setTrustPassword(SSLConfig.getTrustPassword()); + secureConnector.setTruststoreType(SSLConfig.getStoreType()); + secureConnector.setTruststore(SSLConfig.getTruststoreLocation()); + secureConnector.setNeedClientAuth(false); + secureConnector.setWantClientAuth(false); + + secureConnector.setKeyPassword(SSLConfig.getKeyPassword()); + secureConnector.setKeystoreType(SSLConfig.getStoreType()); + secureConnector.setKeystore(SSLConfig.getKeystoreLocation()); + + return new Connector[]{connector, secureConnector}; + } + catch (Exception ex) { + Log.error("Error establishing SSL connector for HTTP Bind", ex); + } + } + + return new Connector[]{connector}; } /** @@ -63,4 +101,12 @@ public void shutdown() throws Exception { server.stop(); } + + private class JiveSslConnector extends SslSocketConnector { + + @Override + protected SSLServerSocketFactory createFactory() throws Exception { + return SSLConfig.getServerSocketFactory(); + } + } }