2017-02-16 4 views
0

Ich habe den folgenden Code, der einen sicheren Websocket-Endpunkt in einer eigenständigen Java-Anwendung (jnlp getriggert) einrichten und mir erlauben soll, von einem Client (Javascript im Browser) mit der URL zu verbinden : ws: // localhost: 8444/echoIch kann keine Verbindung zu einem sicheren Websocket herstellen, der auf Jetty läuft

Der Server ohne Fehler startet, aber ich kann keine Verbindung:

WebSocket-Verbindung zu 'WSS: // localhost: 8444/echo' fehlgeschlagen: Fehler in Verbindungsaufbau: net :: ERR_CONNECTION_CLOSED

server = new Server(); 

    SslContextFactory contextFactory = new SslContextFactory(); 
    contextFactory.setKeyStorePath("/path/keys/keystore.jks"); 
    contextFactory.setKeyStorePassword("changeit"); 
    SslConnectionFactory sslConnectionFactory = new SslConnectionFactory(contextFactory, org.eclipse.jetty.http.HttpVersion.HTTP_1_1.toString()); 

    ServerConnector connector = new ServerConnector(server, sslConnectionFactory); 
    connector.setPort(8444); 

    ServletContextHandler contextHandler = new ServletContextHandler(ServletContextHandler.SESSIONS); 
    contextHandler.setContextPath("/"); 
    HandlerCollection hc = new HandlerCollection(); 
    hc.addHandler(contextHandler); 
    server.setHandler(contextHandler); 

    server.addConnector(connector); 

    // Add websocket servlet 
    ServletHolder wsHolder = new ServletHolder("echo",new EchoSocketServlet()); 
    contextHandler.addServlet(wsHolder,"/echo"); 

    try 
    { 
     server.start(); 
     server.join(); 
    } 
    catch (Exception e) 
    { 
     e.printStackTrace(); 
    } 

Wenn jemand einen offensichtlichen Fehler in den oben genannten erkennen kann, würde einige Rückmeldung geschätzt werden. Außerdem kann ich erfolgreich eine Verbindung zu den obigen herstellen, wenn ich die SslConnectionFactory entferne und mich mit einer nicht SSL-Websocket-URL (ws: //) verbinde.

+0

Wenn Sie versuchen, sich mit etwas wie 'https: // localhost: 8444/blarg' zu verbinden, erhalten Sie eine nützlichere Fehlermeldung? –

+0

Die 'HandlerCollection hc' wird nicht verwendet, Sie können sie jedoch entfernen. –

+0

Versuchte die URL wie in einem Browser vorgeschlagen und erhalten die folgenden: curl: (35) Server abgebrochen der SSL-Handshake Ich hätte gedacht, dass die HC im obigen Code aufgrund der Tatsache verwendet wurde, dass der ContextHandler hinzugefügt wird, die wird dann als Handler zum Serverobjekt hinzugefügt? – dre

Antwort

1

Schließlich wurde es mit viel Versuch und Irrtum, einige Schmerzen und ein wenig Hilfe von diesem Kerl arbeiten: https://stackoverflow.com/a/37882046/2288004

Für alle, die denken, sie könnten durch diese geholfen werden, ich den Server-Code wie unten aktualisiert und ging zu der Mühe, ein selbstsigniertes Zertifikat zu erstellen: Auch das letzte pièce de résistance (bei Verwendung eines selbstsignierten (nicht vertrauenswürdigen) Cert) ist, zu der sicheren URL in Ihrem Browser der Wahl zu navigieren, und Sie aufgefordert, so dass Sie kann eine Ausnahme hinzufügen. Wenn Sie es nicht tun, wird es nie funktionieren !!

final int port = 5040; 
    final int sslPort = 8442; 

    server = new Server(port); 

    SslContextFactory contextFactory = new SslContextFactory(); 
    contextFactory.setKeyStorePath("/Users/me/keystore"); 
    contextFactory.setKeyStorePassword("password"); 
    SslConnectionFactory sslConnectionFactory = new SslConnectionFactory(contextFactory, org.eclipse.jetty.http.HttpVersion.HTTP_1_1.toString()); 

    HttpConfiguration config = new HttpConfiguration(); 
    config.setSecureScheme("https"); 
    config.setSecurePort(sslPort); 
    config.setOutputBufferSize(32786); 
    config.setRequestHeaderSize(8192); 
    config.setResponseHeaderSize(8192); 
    HttpConfiguration sslConfiguration = new HttpConfiguration(config); 
    sslConfiguration.addCustomizer(new SecureRequestCustomizer()); 
    HttpConnectionFactory httpConnectionFactory = new HttpConnectionFactory(sslConfiguration); 

    ServerConnector connector = new ServerConnector(server, sslConnectionFactory, httpConnectionFactory); 

    connector.setPort(sslPort); 
    server.addConnector(connector); 

    ServletContextHandler context = new ServletContextHandler(ServletContextHandler.SESSIONS); 
    context.setContextPath("/"); 

    try 
    { 
     // Add websocket servlet 
     ServletHolder wsHolder = new ServletHolder("ws-echo", new EchoSocketServlet()); 
     context.addServlet(wsHolder,"/echo"); 

     server.setHandler(context); 

     server.start(); 
     server.dump(System.err); 
     server.join(); 
    } 
    catch (Throwable t) 
    { 
     t.printStackTrace(System.err); 
    } 
Verwandte Themen