2013-01-15 15 views
11

Mam serwer WebSocket uruchomiony w osadzonym pomoście (8.1.8.v20121106) i chciałbym połączyć się z nim z innej aplikacji Java z pomostem WebSocketClient. Jest to metoda testowa, której używam:Jetty WebSocketClient przez ssl

@Test 
public void testWebSockets() throws Exception { 
    logger.debug("START testWebSockets()"); 
    WebSocketClientFactory factory = new WebSocketClientFactory(); 
    factory.setBufferSize(4096); 
    factory.start();   

    WebSocketClient client = factory.newWebSocketClient(); 
    client.setMaxIdleTime(30000); 
    client.setMaxTextMessageSize(1024); 
    client.setProtocol("MyProtocol");          

    WebSocket webSocket = new ClientWebSocket(); 
    String wsUrl = "ws://localhost:8080/websocket"; 
    String wssUrl = "wss://localhost:8443/websocket"; 
    Future future = client.open(new URI(wssUrl), webSocket); 
    WebSocket.Connection connection = (Connection) future.get(10, TimeUnit.SECONDS); 
    assertNotNull("No connection!", connection); 
    connection.sendMessage("TestMessage"); 
    connection.close(); 
    logger.debug("END testWebSockets()"); 
} 

To nie jest problem z wykorzystaniem wsUrl, ale nie mogę go uruchomić z wss. Nie sądzę, że serwer jest problemem, ponieważ nie mam problemu z łączeniem się z wss z javascript. Co robię źle w tym teście?

Zarówno serwer, jak i klient rejestrują "zły rekord MAC" w konfiguracji ssl. Jest to ostatnia część dziennika serwera:

2013-01-15 10:26:06,398 qtp9902580-25 DEBUG org.eclipse.jetty.io.nio.ssl - [Session-1, SSL_NULL_WITH_NULL_NULL] unwrap OK NEED_TASK consumed=107 produced=0 
2013-01-15 10:26:06,399 qtp9902580-25 DEBUG org.eclipse.jetty.io.nio.ssl - [Session-1, SSL_NULL_WITH_NULL_NULL] [email protected] SSL NEED_TASK i/o/u=75/0/0 ishut=false oshut=false {[email protected],g=HttpGenerator{s=0,h=-1 
,b=-1,c=-1},p=HttpParser{s=-14,l=0,c=0},r=0} NEED_TASK filled=69/75 flushed=0/0 
2013-01-15 10:26:06,413 qtp9902580-25 DEBUG org.eclipse.jetty.io.nio.ssl - [Session-1, SSL_NULL_WITH_NULL_NULL] [email protected] SSL NEED_UNWRAP i/o/u=75/0/0 ishut=false oshut=false {[email protected],g=HttpGenerator{s=0,h= 
-1,b=-1,c=-1},p=HttpParser{s=-14,l=0,c=0},r=0} NEED_UNWRAP filled=0/75 flushed=0/0 
2013-01-15 10:26:06,415 qtp9902580-25 DEBUG org.eclipse.jetty.io.nio.ssl - [Session-1, SSL_NULL_WITH_NULL_NULL] unwrap OK NEED_UNWRAP consumed=6 produced=0 
2013-01-15 10:26:06,416 qtp9902580-25 DEBUG org.eclipse.jetty.io.nio.ssl - [Session-1, SSL_NULL_WITH_NULL_NULL] [email protected] SSL NEED_UNWRAP i/o/u=69/0/0 ishut=false oshut=false {[email protected],g=HttpGenerator{s=0,h= 
-1,b=-1,c=-1},p=HttpParser{s=-14,l=0,c=0},r=0} NEED_UNWRAP filled=0/69 flushed=0/0 
2013-01-15 10:26:06,419 qtp9902580-25 DEBUG org.eclipse.jetty.io.nio.ssl - [Session-1, SSL_NULL_WITH_NULL_NULL] unwrap OK NEED_WRAP consumed=69 produced=0 
2013-01-15 10:26:06,420 qtp9902580-25 DEBUG org.eclipse.jetty.io.nio.ssl - [Session-1, SSL_NULL_WITH_NULL_NULL] [email protected] SSL NEED_WRAP i/o/u=0/0/0 ishut=false oshut=false {[email protected],g=HttpGenerator{s=0,h=-1, 
b=-1,c=-1},p=HttpParser{s=-14,l=0,c=0},r=0} NEED_WRAP filled=0/0 flushed=0/0 
2013-01-15 10:26:06,421 qtp9902580-25 DEBUG org.eclipse.jetty.io.nio.ssl - [Session-1, SSL_NULL_WITH_NULL_NULL] wrap OK NEED_WRAP consumed=0 produced=6 
2013-01-15 10:26:06,422 qtp9902580-25 DEBUG org.eclipse.jetty.io.nio.ssl - [Session-1, SSL_NULL_WITH_NULL_NULL] [email protected] SSL NEED_WRAP i/o/u=0/0/0 ishut=false oshut=false {[email protected],g=HttpGenerator{s=0,h=-1, 
b=-1,c=-1},p=HttpParser{s=-14,l=0,c=0},r=0} NEED_WRAP filled=0/0 flushed=6/0 
2013-01-15 10:26:06,423 qtp9902580-25 DEBUG org.eclipse.jetty.io.nio.ssl - [Session-1, SSL_NULL_WITH_NULL_NULL] wrap OK FINISHED consumed=0 produced=69 
2013-01-15 10:26:06,424 qtp9902580-25 DEBUG org.eclipse.jetty.io.nio.ssl - [Session-1, SSL_NULL_WITH_NULL_NULL] [email protected] SSL NOT_HANDSHAKING i/o/u=0/0/0 ishut=false oshut=false {[email protected],g=HttpGenerator{s=0 
,h=-1,b=-1,c=-1},p=HttpParser{s=-14,l=0,c=0},r=0} NOT_HANDSHAKING filled=0/0 flushed=69/0 
2013-01-15 10:26:06,426 qtp9902580-25 DEBUG org.eclipse.jetty.io.nio.ssl - [Session-1, SSL_NULL_WITH_NULL_NULL] [email protected] SSL NOT_HANDSHAKING i/o/u=0/0/0 ishut=false oshut=false {[email protected],g=HttpGenerator{s=0 
,h=-1,b=-1,c=-1},p=HttpParser{s=-14,l=0,c=0},r=0} NOT_HANDSHAKING filled=0/0 flushed=0/0 
2013-01-15 10:26:06,428 qtp9902580-25 DEBUG org.eclipse.jetty.io.nio.ssl - [Session-1, SSL_NULL_WITH_NULL_NULL] [email protected] SSL NOT_HANDSHAKING i/o/u=245/0/0 ishut=false oshut=false {[email protected],g=HttpGenerator{s 
=0,h=-1,b=-1,c=-1},p=HttpParser{s=-14,l=0,c=0},r=0} NOT_HANDSHAKING filled=245/245 flushed=0/0 
2013-01-15 10:26:06,430 qtp9902580-25 DEBUG org.eclipse.jetty.io.nio.ssl - [email protected]{l(/127.0.0.1:65084)<->r(/127.0.0.1:8444),d=true,open=true,ishut=false,oshut=false,rb=false,wb=false,w=true,i=1r}-{[email protected] SSL NEED_WRAP 
i/o/u=245/0/0 ishut=false oshut=false {[email protected],g=HttpGenerator{s=0,h=-1,b=-1,c=-1},p=HttpParser{s=-14,l=0,c=0},r=0}} 
javax.net.ssl.SSLException: bad record MAC 
     at sun.security.ssl.Alerts.getSSLException(Alerts.java:208) 
     at sun.security.ssl.SSLEngineImpl.fatal(SSLEngineImpl.java:1639) 
     at sun.security.ssl.SSLEngineImpl.fatal(SSLEngineImpl.java:1607) 
     at sun.security.ssl.SSLEngineImpl.readRecord(SSLEngineImpl.java:979) 
     at sun.security.ssl.SSLEngineImpl.readNetRecord(SSLEngineImpl.java:884) 
     at sun.security.ssl.SSLEngineImpl.unwrap(SSLEngineImpl.java:758) 
     at javax.net.ssl.SSLEngine.unwrap(SSLEngine.java:624) 
     at org.eclipse.jetty.io.nio.SslConnection.unwrap(SslConnection.java:524) 
     at org.eclipse.jetty.io.nio.SslConnection.process(SslConnection.java:359) 
     at org.eclipse.jetty.io.nio.SslConnection.access$900(SslConnection.java:48) 
     at org.eclipse.jetty.io.nio.SslConnection$SslEndPoint.fill(SslConnection.java:666) 
     at org.eclipse.jetty.http.HttpParser.fill(HttpParser.java:1035) 
     at org.eclipse.jetty.http.HttpParser.parseNext(HttpParser.java:280) 
     at org.eclipse.jetty.http.HttpParser.parseAvailable(HttpParser.java:235) 
     at org.eclipse.jetty.server.AsyncHttpConnection.handle(AsyncHttpConnection.java:82) 
     at org.eclipse.jetty.io.nio.SslConnection.handle(SslConnection.java:196) 
     at org.eclipse.jetty.io.nio.SelectChannelEndPoint.handle(SelectChannelEndPoint.java:628) 
     at org.eclipse.jetty.io.nio.SelectChannelEndPoint$1.run(SelectChannelEndPoint.java:52) 
     at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:608) 
     at org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:543) 
     at java.lang.Thread.run(Thread.java:722) 
2013-01-15 10:26:06,463 qtp9902580-25 DEBUG org.eclipse.jetty.io.nio.ChannelEndPoint - close [email protected]{l(/127.0.0.1:65084)<->r(/127.0.0.1:8444),d=true,open=true,ishut=false,oshut=false,rb=false,wb=false,w=true,i=1!}-{[email protected] 
3ac SSL NEED_WRAP i/o/u=245/0/0 ishut=false oshut=false {[email protected],g=HttpGenerator{s=0,h=-1,b=-1,c=-1},p=HttpParser{s=-14,l=0,c=0},r=0}} 
2013-01-15 10:26:06,469 qtp9902580-25 DEBUG org.eclipse.jetty.http.HttpParser - 
javax.net.ssl.SSLException: bad record MAC 
     at sun.security.ssl.Alerts.getSSLException(Alerts.java:208) 
     at sun.security.ssl.SSLEngineImpl.fatal(SSLEngineImpl.java:1639) 
     at sun.security.ssl.SSLEngineImpl.fatal(SSLEngineImpl.java:1607) 
     at sun.security.ssl.SSLEngineImpl.readRecord(SSLEngineImpl.java:979) 
     at sun.security.ssl.SSLEngineImpl.readNetRecord(SSLEngineImpl.java:884) 
     at sun.security.ssl.SSLEngineImpl.unwrap(SSLEngineImpl.java:758) 
     at javax.net.ssl.SSLEngine.unwrap(SSLEngine.java:624) 
     at org.eclipse.jetty.io.nio.SslConnection.unwrap(SslConnection.java:524) 
     at org.eclipse.jetty.io.nio.SslConnection.process(SslConnection.java:359) 
     at org.eclipse.jetty.io.nio.SslConnection.access$900(SslConnection.java:48) 
     at org.eclipse.jetty.io.nio.SslConnection$SslEndPoint.fill(SslConnection.java:666) 
     at org.eclipse.jetty.http.HttpParser.fill(HttpParser.java:1035) 
     at org.eclipse.jetty.http.HttpParser.parseNext(HttpParser.java:280) 
     at org.eclipse.jetty.http.HttpParser.parseAvailable(HttpParser.java:235) 
     at org.eclipse.jetty.server.AsyncHttpConnection.handle(AsyncHttpConnection.java:82) 
     at org.eclipse.jetty.io.nio.SslConnection.handle(SslConnection.java:196) 
     at org.eclipse.jetty.io.nio.SelectChannelEndPoint.handle(SelectChannelEndPoint.java:628) 
     at org.eclipse.jetty.io.nio.SelectChannelEndPoint$1.run(SelectChannelEndPoint.java:52) 
     at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:608) 
     at org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:543) 
     at java.lang.Thread.run(Thread.java:722) 
2013-01-15 10:26:06,506 qtp9902580-25 DEBUG org.eclipse.jetty.http.HttpParser - HttpParser{s=-14,l=0,c=0} 
org.eclipse.jetty.io.EofException 
     at org.eclipse.jetty.http.HttpParser.fill(HttpParser.java:1041) 
     at org.eclipse.jetty.http.HttpParser.parseNext(HttpParser.java:280) 
     at org.eclipse.jetty.http.HttpParser.parseAvailable(HttpParser.java:235) 
     at org.eclipse.jetty.server.AsyncHttpConnection.handle(AsyncHttpConnection.java:82) 
     at org.eclipse.jetty.io.nio.SslConnection.handle(SslConnection.java:196) 
     at org.eclipse.jetty.io.nio.SelectChannelEndPoint.handle(SelectChannelEndPoint.java:628) 
     at org.eclipse.jetty.io.nio.SelectChannelEndPoint$1.run(SelectChannelEndPoint.java:52) 
     at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:608) 
     at org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:543) 
     at java.lang.Thread.run(Thread.java:722) 
Caused by: javax.net.ssl.SSLException: bad record MAC 
     at sun.security.ssl.Alerts.getSSLException(Alerts.java:208) 
     at sun.security.ssl.SSLEngineImpl.fatal(SSLEngineImpl.java:1639) 
     at sun.security.ssl.SSLEngineImpl.fatal(SSLEngineImpl.java:1607) 
     at sun.security.ssl.SSLEngineImpl.readRecord(SSLEngineImpl.java:979) 
     at sun.security.ssl.SSLEngineImpl.readNetRecord(SSLEngineImpl.java:884) 
     at sun.security.ssl.SSLEngineImpl.unwrap(SSLEngineImpl.java:758) 
     at javax.net.ssl.SSLEngine.unwrap(SSLEngine.java:624) 
     at org.eclipse.jetty.io.nio.SslConnection.unwrap(SslConnection.java:524) 
     at org.eclipse.jetty.io.nio.SslConnection.process(SslConnection.java:359) 
     at org.eclipse.jetty.io.nio.SslConnection.access$900(SslConnection.java:48) 
     at org.eclipse.jetty.io.nio.SslConnection$SslEndPoint.fill(SslConnection.java:666) 
     at org.eclipse.jetty.http.HttpParser.fill(HttpParser.java:1035) 
     ... 9 more 
2013-01-15 10:26:06,470 qtp9902580-23 Selector0 DEBUG org.eclipse.jetty.io.nio - destroyEndPoint [email protected]{l(null)<->r(0.0.0.0/0.0.0.0:8444),d=true,open=false,ishut=true,oshut=true,rb=false,wb=false,w=true,i=1!}-{[email protected] 
SSL NEED_WRAP i/o/u=245/0/0 ishut=false oshut=false {[email protected],g=HttpGenerator{s=0,h=-1,b=-1,c=-1},p=HttpParser{s=-14,l=0,c=0},r=0}} 
2013-01-15 10:26:06,555 qtp9902580-25 DEBUG org.eclipse.jetty.server.AsyncHttpConnection - Disabled read interest while writing response SSL NEED_WRAP i/o/u=245/0/0 ishut=false oshut=false {[email protected],g=HttpGenerator{s=0 
,h=-1,b=-1,c=-1},p=HttpParser{s=0,l=0,c=0},r=0} 
2013-01-15 10:26:06,559 qtp9902580-23 Selector0 DEBUG org.eclipse.jetty.server.AbstractHttpConnection - closed [email protected],g=HttpGenerator{s=0,h=-1,b=-1,c=-1},p=HttpParser{s=0,l=0,c=0},r=0 
2013-01-15 10:26:06,560 qtp9902580-25 DEBUG org.eclipse.jetty.io.nio - EOF 
org.eclipse.jetty.io.EofException 
     at org.eclipse.jetty.http.HttpParser.fill(HttpParser.java:1041) 
     at org.eclipse.jetty.http.HttpParser.parseNext(HttpParser.java:280) 
     at org.eclipse.jetty.http.HttpParser.parseAvailable(HttpParser.java:235) 
     at org.eclipse.jetty.server.AsyncHttpConnection.handle(AsyncHttpConnection.java:82) 
     at org.eclipse.jetty.io.nio.SslConnection.handle(SslConnection.java:196) 
     at org.eclipse.jetty.io.nio.SelectChannelEndPoint.handle(SelectChannelEndPoint.java:628) 
     at org.eclipse.jetty.io.nio.SelectChannelEndPoint$1.run(SelectChannelEndPoint.java:52) 
     at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:608) 
     at org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:543) 
     at java.lang.Thread.run(Thread.java:722) 
Caused by: javax.net.ssl.SSLException: bad record MAC 
     at sun.security.ssl.Alerts.getSSLException(Alerts.java:208) 
     at sun.security.ssl.SSLEngineImpl.fatal(SSLEngineImpl.java:1639) 
     at sun.security.ssl.SSLEngineImpl.fatal(SSLEngineImpl.java:1607) 
     at sun.security.ssl.SSLEngineImpl.readRecord(SSLEngineImpl.java:979) 
     at sun.security.ssl.SSLEngineImpl.readNetRecord(SSLEngineImpl.java:884) 
     at sun.security.ssl.SSLEngineImpl.unwrap(SSLEngineImpl.java:758) 
     at javax.net.ssl.SSLEngine.unwrap(SSLEngine.java:624) 
     at org.eclipse.jetty.io.nio.SslConnection.unwrap(SslConnection.java:524) 
     at org.eclipse.jetty.io.nio.SslConnection.process(SslConnection.java:359) 
     at org.eclipse.jetty.io.nio.SslConnection.access$900(SslConnection.java:48) 
     at org.eclipse.jetty.io.nio.SslConnection$SslEndPoint.fill(SslConnection.java:666) 
     at org.eclipse.jetty.http.HttpParser.fill(HttpParser.java:1035) 
     ... 9 more 
2013-01-15 10:26:06,623 qtp9902580-25 DEBUG org.eclipse.jetty.io.nio.ChannelEndPoint - close [email protected]{l(null)<->r(0.0.0.0/0.0.0.0:8444),d=true,open=false,ishut=true,oshut=true,rb=false,wb=false,w=true,i=1-}-{[email protected] SSL 
NEED_WRAP i/o/u=245/0/0 ishut=false oshut=false {[email protected],g=HttpGenerator{s=0,h=-1,b=-1,c=-1},p=HttpParser{s=0,l=0,c=0},r=0}} 
+1

Twoja odpowiedź jest tutaj: http://stackoverflow.com/questions/8154617/how-to-troubleshoot-ssl-bad-record- mac-exception – jdelobel

+0

@jdelobel - możliwe, ale mało prawdopodobne. prawdopodobnie mógł go zawęzić, wyłączając IPv6 w swojej karcie sieciowej, a następnie restartując JVM (między innymi). Również ślad Wireshark może dać ci wyobrażenie o tym, jaki ruch w sieci jest głośny. – djangofan

+0

Ja po drugie wołam o ślad wireshark - dobrze byłoby zobaczyć, jak daleko sięga wymiana SSL. Z której wersji Java korzystasz? Jeśli korzystasz z Javy 7, zobaczyłbym, czy Java 6 zrobiła różnicę (Java 7 spróbuje domyślnie TLSv1.2 ... podczas gdy Java 6 zrobi TLSv1). Przywołuję to, ponieważ miałem ostatnio problemy z Java 7 TLSv1.2 i niektórymi klientami mobilnymi (Java 6 nie miała żadnych problemów). – Gareth

Odpowiedz

2

Próbowałem też z Jetty 9.0.3, ale mam ten sam wyjątek jako Jetty - SSL Websocket Client

Ponieważ wydaje się, że klient websocket pomost ma problemy tam, gdzie inni don „t, przeszedłem do async http client, który działa dla mnie idealny:

@Test 
public void testNingWebSockets() throws Exception { 
    logger.debug("START testNingWebSockets()"); 

    String wsUrl = "ws://localhost:8081/websocket"; 
    String wssUrl = "wss://localhost:8444/websocket"; 
    AsyncHttpClient client = new AsyncHttpClient(); 
    WebSocketUpgradeHandler handler = new WebSocketUpgradeHandler.Builder().addWebSocketListener(new ClientWebSocket()).build(); 
    WebSocket websocket = client.prepareGet(wssUrl).execute(handler).get(); 
    Assert.assertNotNull("No connection!", websocket); 
    logger.debug("Connection made: " + websocket.isOpen()); 
    websocket.sendMessage("TestMessage".getBytes()); 
    Thread.sleep(1000); 
    websocket.close(); 
    logger.debug("END testNingWebSockets()"); 
} 
+0

Przełączanie z Jetty na asynchroniczny + netty również zapisało mój dzień , dzięki. :) – lapo

+0

@snlp i lapo Czy możesz podać link do prostej implementacji połączenia sieciowego klienta Async Http? Ten tutaj: https://jfarcand.wordpress.com/2011/12/21/writing-websocket-clients-using-asynchttpclient/ jest trochę zagmatwany pod względem Słuchaczy. – Sudhanshu

+0

Zobacz dokumentację [async http client] (https://github.com/AsyncHttpClient/async-http-client) (link został zerwany) – snIp