2013-01-15 66 views
11

我有一個在嵌入式jetty(8.1.8.v20121106)中運行的WebSocket服務器,並希望通過jetty WebSocketClient從另一個Java應用程序連接到它。這是我使用的測試方法:Jetty WebSocketClient通過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()"); 
} 

這不是使用wsUrl的問題,但我不能使用wss工作。我不認爲服務器是問題,因爲我沒有問題從JavaScript連接wss。我在這個測試中做錯了什麼?

服務器和客戶端都在ssl安裝程序上記錄「壞記錄MAC」。這是服務器日誌的最後部分:

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

你的答案就在這裏:http://stackoverflow.com/questions/8154617/how-to-troubleshoot-ssl-bad-record- mac-exception – jdelobel

+0

@jdelobel - 可能,但不太可能。他可以通過在他的網絡適配器中禁用IPv6來縮小範圍,然後重新啓動JVM(等等)。此外,Wireshark跟蹤可能會讓您瞭解網絡上響應的流量類型。 – djangofan

+0

我第二次打電話給一個wireshark跟蹤 - 看看SSL交換有多遠會有幫助。另外,你使用的是哪個版本的java?如果您使用Java 7,我會看看Java 6是否有所作爲(Java 7將默認嘗試執行TLSv1.2 ...而Java 6將執行TLSv1)。由於我最近遇到了Java 7 TLSv1.2和一些移動客戶端(Java 6沒有問題)的問題,所以我提出了這個問題。 – Gareth

回答

2

我也試圖與碼頭9.0.3,但得到了同樣的異常,因爲Jetty - SSL Websocket Client

因爲它似乎是碼頭的WebSocket客戶端有問題,別人不要「T,I切換到async http client,運行非常適合我:

@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

從Jetty切換到async + netty也保存了我的一天, 謝謝。 :) – lapo

+0

@snlp和lapo您可以提供一個鏈接到一個簡單的websocket連接實現的異步Http客戶端?這裏的一個:https://jfarcand.wordpress.com/2011/12/21/writing-websocket-clients-using-asynchttpclient/在聽衆方面有點混亂。 – Sudhanshu

+0

請參閱[異步HTTP客戶端](https://github.com/AsyncHttpClient/async-http-client)文檔(鏈接已損壞) – snIp