2013-01-15 16 views
11

私は組み込みjetty(8.1.8.v20121106)で動作しているWebSocketサーバーを持っており、jetty WebSocketClientを使って別のJavaアプリケーションから接続したいと考えています。Jetty WebSocketClient over 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

あなたの答えはここにある::「T、私は私のために完璧に実行され、async http clientに切り替え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で試してみましたが、桟橋のWebSocketクライアントが問題他人丼を持っているようですのでJetty - SSL Websocket 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 Async Http Clientの単純なwebsocket接続の実装へのリンクを提供してください。ここにあるもの:https://jfarcand.wordpress.com/2011/12/21/writing-websocket-clients-using-asynchttpclient/はリスナーの面では少し混乱します。 – Sudhanshu

+0

[async http client](https://github.com/AsyncHttpClient/async-http-client)のドキュメントを参照してください(リンクが壊れています) – snIp

関連する問題