From 354c459aa5984cb3f9f8e5f7ef9d96ee2da5bd83 Mon Sep 17 00:00:00 2001 From: Ziver Koc Date: Wed, 3 Dec 2008 15:11:04 +0000 Subject: [PATCH] Added SSl support in the HTTPServer --- src/zutil/network/http/HttpServer.java | 64 ++++++++++++++++++++++++-- src/zutil/test/HTTPGuessTheNumber.java | 4 +- 2 files changed, 64 insertions(+), 4 deletions(-) diff --git a/src/zutil/network/http/HttpServer.java b/src/zutil/network/http/HttpServer.java index 28196cf..9365b7c 100644 --- a/src/zutil/network/http/HttpServer.java +++ b/src/zutil/network/http/HttpServer.java @@ -1,12 +1,21 @@ package zutil.network.http; import java.io.BufferedReader; +import java.io.File; import java.io.IOException; import java.io.InputStreamReader; import java.net.ServerSocket; import java.net.Socket; +import java.security.KeyStoreException; +import java.security.NoSuchAlgorithmException; +import java.security.NoSuchProviderException; +import java.security.cert.CertificateException; +import java.security.cert.X509Certificate; import java.util.HashMap; +import javax.net.ssl.SSLServerSocket; +import javax.net.ssl.SSLServerSocketFactory; + import zutil.MultiPrintStream; /** @@ -24,6 +33,8 @@ public class HttpServer extends Thread{ public final String server_url; public final int server_port; + private File keyStore; + private String keyStorePass; private HashMap pages; private HttpPage defaultPage; @@ -37,8 +48,23 @@ public class HttpServer extends Thread{ * @param port The port that the server should listen to */ public HttpServer(String url, int port){ + this(url, port, null, null); + } + + + /** + * Creates a new instance of the sever + * + * @param url The address to the server + * @param port The port that the server should listen to + * @param sslCert If this is not null then the server will use SSL connection with this keyStore file path + * @param sslCert If this is not null then the server will use a SSL connection with the given certificate + */ + public HttpServer(String url, int port, File keyStore, String keyStorePass){ this.server_url = url; this.server_port = port; + this.keyStorePass = keyStorePass; + this.keyStore = keyStore; pages = new HashMap(); sessions = new HashMap>(); @@ -67,17 +93,49 @@ public class HttpServer extends Thread{ public void run(){ try{ - ServerSocket ss = new ServerSocket(server_port); - MultiPrintStream.out.println("Http Server Running!!!"); + ServerSocket ss; + if(keyStorePass != null && keyStore != null){ + registerCertificate(keyStore, keyStorePass); + ss = initSSL(server_port); + MultiPrintStream.out.println("Https Server Running!!!"); + } + else{ + ss = new ServerSocket(server_port); + MultiPrintStream.out.println("Http Server Running!!!"); + } while(true){ new HttpServerThread(ss.accept()); } - } catch (IOException e) { + } catch (Exception e) { e.printStackTrace(); } } + /** + * Initiates a SSLServerSocket + * + * @param port The port to listen to + * @return The SSLServerSocket + * @throws IOException + */ + private ServerSocket initSSL(int port) throws IOException{ + SSLServerSocketFactory sslserversocketfactory = + (SSLServerSocketFactory) SSLServerSocketFactory.getDefault(); + return sslserversocketfactory.createServerSocket(port); + + } + + /** + * Registers the given cert file to the KeyStore + * + * @param certFile The cert file + */ + private void registerCertificate(File keyStore, String keyStorePass) throws CertificateException, IOException, KeyStoreException, NoSuchProviderException, NoSuchAlgorithmException{ + System.setProperty("javax.net.ssl.keyStore", keyStore.getAbsolutePath()); + System.setProperty("javax.net.ssl.keyStorePassword", keyStorePass); + } + /** * Internal class that handles all the requests * diff --git a/src/zutil/test/HTTPGuessTheNumber.java b/src/zutil/test/HTTPGuessTheNumber.java index 4daa5c9..9bd4a5c 100644 --- a/src/zutil/test/HTTPGuessTheNumber.java +++ b/src/zutil/test/HTTPGuessTheNumber.java @@ -3,6 +3,7 @@ package zutil.test; import java.io.IOException; import java.util.HashMap; +import zutil.FileFinder; import zutil.network.http.HttpPage; import zutil.network.http.HttpPrintStream; import zutil.network.http.HttpServer; @@ -10,7 +11,8 @@ import zutil.network.http.HttpServer; public class HTTPGuessTheNumber implements HttpPage{ public static void main(String[] args) throws IOException{ - HttpServer server = new HttpServer("localhost", 80); + HttpServer server = new HttpServer("localhost", 443, FileFinder.find("keySSL"), "rootroot");//SSL + //HttpServer server = new HttpServer("localhost", 80); server.setDefaultPage(new HTTPGuessTheNumber()); server.run(); }