I am trying to setup a secure WebSocket server with Jetty like the following:
import java.util.ArrayList; import java.util.List; import org.eclipse.jetty.http.HttpVersion; import org.eclipse.jetty.server.Handler; import org.eclipse.jetty.server.HttpConfiguration; import org.eclipse.jetty.server.HttpConnectionFactory; import org.eclipse.jetty.server.Server; import org.eclipse.jetty.server.ServerConnector; import org.eclipse.jetty.server.SslConnectionFactory; import org.eclipse.jetty.server.handler.ContextHandler; import org.eclipse.jetty.server.handler.HandlerCollection; import org.eclipse.jetty.util.ssl.SslContextFactory; import org.eclipse.jetty.websocket.server.WebSocketHandler; import org.eclipse.jetty.websocket.servlet.WebSocketServletFactory; public class WebSocketServer { private Server server; private String host="localhost"; private int port=8080; private String keyStorePath = "C:\\keystore"; private String keyStorePassword="password"; private String keyManagerPassword="password"; private List<Handler> webSocketHandlerList = new ArrayList(); MessageHandler messagehandler; public WebSocketServer() { System.out.println("WebSocketServer"); server = new Server(); // connector configuration SslContextFactory sslContextFactory = new SslContextFactory(); sslContextFactory.setKeyStorePath(keyStorePath); sslContextFactory.setKeyStorePassword(keyStorePassword); sslContextFactory.setKeyManagerPassword(keyManagerPassword); SslConnectionFactory sslConnectionFactory = new SslConnectionFactory(sslContextFactory, HttpVersion.HTTP_1_1.asString()); HttpConnectionFactory httpConnectionFactory = new HttpConnectionFactory(new HttpConfiguration()); ServerConnector sslConnector = new ServerConnector(server, sslConnectionFactory, httpConnectionFactory); sslConnector.setHost(host); sslConnector.setPort(port); server.addConnector(sslConnector); // handler configuration HandlerCollection handlerCollection = new HandlerCollection(); handlerCollection.setHandlers(webSocketHandlerList.toArray(new Handler[0])); server.setHandler(handlerCollection); WebSocketHandler wsHandler = new WebSocketHandler() { @Override public void configure(WebSocketServletFactory webSocketServletFactory) { webSocketServletFactory.register(MyWebSocketHandler.class); } }; ContextHandler wsContextHandler = new ContextHandler(); wsContextHandler.setHandler(wsHandler); wsContextHandler.setContextPath("/"); // this context path doesn't work ftm webSocketHandlerList.add(wsHandler); messagehandler = new MessageHandler(); new Thread(messagehandler).start(); try { server.start(); } catch (Exception e) { e.printStackTrace(); } } }
The keystore file is created with the following command found here in the jdk/bin folder:
keytool.exe -keystore keystore -alias jetty -genkey -keyalg RSA
After that I moved the file into the C directory for easy path usage.
With this configuration my server seems to start without any problems. So I am trying to connect to it with my website like this:
ws = new WebSocket("wss://localhost:8080/");
This doesn't work at all. Like written here, I think I have to configure the SSL certificate. Furthermore, to create the server I used this tutorial and for the java client side they implement a truststore
. Do I have to do something similar for JavaScript?