2013-01-15 32 views
11

Tôi đã có một máy chủ WebSocket đang chạy trong một cầu nối được nhúng (8.1.8.v20121106) và muốn kết nối với nó từ một ứng dụng Java khác với jS WebSocketClient. Đây là phương pháp thử tôi sử dụng:Jetty WebSocketClient qua 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()"); 
} 

Nó không phải là vấn đề khi sử dụng wsUrl nhưng tôi không thể làm việc với wss. Tôi không nghĩ rằng máy chủ là vấn đề vì tôi không có vấn đề kết nối với wss từ javascript. Tôi đang làm gì sai trong bài kiểm tra này?

Cả máy chủ và máy khách đều đăng nhập "MAC bản ghi xấu" trên thiết lập ssl. Đây là phần cuối cùng của nhật ký máy chủ:

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

câu trả lời của bạn là ở đây: http://stackoverflow.com/questions/8154617/how-to-troubleshoot-ssl-bad-record- mac-exception – jdelobel

+0

@jdelobel - có thể, nhưng không chắc. ông có thể có thể thu hẹp nó xuống bằng cách vô hiệu hóa IPv6 trong bộ điều hợp mạng của mình và sau đó khởi động lại JVM (trong số những thứ khác). Ngoài ra, một dấu vết Wireshark có thể cung cấp cho bạn một số ý tưởng về loại lưu lượng truy cập nào đang vang lên trên mạng. – djangofan

+0

Tôi thứ hai cuộc gọi cho một dấu vết wireshark - nó sẽ rất hữu ích để xem cách xa trao đổi SSL được. Ngoài ra, bạn đang sử dụng phiên bản java nào? Nếu bạn đang sử dụng Java 7, tôi sẽ thấy nếu Java 6 tạo ra sự khác biệt (Java 7 sẽ cố gắng làm TLSv1.2 theo mặc định ... trong khi Java 6 sẽ làm TLSv1). Tôi đưa ra điều này vì gần đây tôi đã có vấn đề với Java 7 TLSv1.2 và một số máy khách di động (Java 6 không có vấn đề gì). – Gareth

Trả lời

2

Tôi cũng đã cố gắng với Jetty 9.0.3, nhưng có những ngoại lệ như Jetty - SSL Websocket Client

Kể từ khi có vẻ như rằng WebSocket client cầu cảng có vấn đề mà người khác don 't, tôi chuyển sang async http client, chạy hoàn hảo cho tôi:

@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

Chuyển từ Jetty sang async + netty cũng đã lưu ngày của tôi , cảm ơn. :) – lapo

+0

@snlp và lapo Bạn có thể vui lòng cung cấp liên kết đến việc triển khai kết nối websocket đơn giản của Async Http Client không? Một ở đây: https://jfarcand.wordpress.com/2011/12/21/writing-websocket-clients-using-asynchttpclient/ là một chút bối rối về người nghe. – Sudhanshu

+0

Xem tài liệu [async http client] (https://github.com/AsyncHttpClient/async-http-client) (liên kết đã bị hỏng) – snIp