Tyrus wss:// websocket不通过鱿鱼代理

量子力学

这是使用Java 8,squid 3.1.2和tyrus-standalone-client-1.12.jarwebsocket实现的。


更新:它仍然不能与Tyrus一起使用。但是,似乎问题不在于鱿鱼,因为当我让Chrome使用代理并直接在此处连接到SO时,wss://qa.stackoverflow.com通过鱿鱼代理的连接可以正常工作。


我正在使用javax.websocket客户端简单示例的可接受答案中给出的测试程序来尝试使鱿鱼代理运行。

但是,我将其更改为使用websockets.org回显服务器,因此URI从更改wss://real.okcoin.cn:10440/websocket/okcoinapiwss://echo.websocket.org

当我不使用代理时,测试程序可以与wss://echo.websocket.org和一起正常使用ws://echo.websocket.org

当我指定通过JVM级代理-Dhttp.proxyHost-Dhttp.proxyPort-Dhttps.proxyHost-Dhttps.proxyPortws://URI工作正常,但在wss://一个没有。

我已经通过tcpdump验证了流量将流向代理,测试程序正在向CONNECT代理发送,并且代理向回发送了Connection established但是,此时没有其他事情发生:

# tcpdump -n -l -s 0 -S -X  'host 172.16.99.15'
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 65535 bytes
17:21:45.361023 IP 172.16.99.21.36521 > 172.16.99.15.3128: S 1720321489:1720321489(0) win 14600 <mss 1460,sackOK,timestamp 1135431 0,nop,wscale 5>
        0x0000:  4500 003c 5696 4000 4006 c5e0 ac10 6315  E..<V.@[email protected].
        0x0010:  ac10 630f 8ea9 0c38 668a 05d1 0000 0000  ..c....8f.......
        0x0020:  a002 3908 1e74 0000 0204 05b4 0402 080a  ..9..t..........
        0x0030:  0011 5347 0000 0000 0103 0305            ..SG........
17:21:45.361763 IP 172.16.99.15.3128 > 172.16.99.21.36521: S 1626710395:1626710395(0) ack 1720321490 win 14480 <mss 1460,sackOK,timestamp 1127109 1135431,nop,wscale 7>
        0x0000:  4500 003c 0000 4000 4006 1c77 ac10 630f  E..<..@[email protected].
        0x0010:  ac10 6315 0c38 8ea9 60f5 a17b 668a 05d2  ..c..8..`..{f...
        0x0020:  a012 3890 613d 0000 0204 05b4 0402 080a  ..8.a=..........
        0x0030:  0011 32c5 0011 5347 0103 0307            ..2...SG....
17:21:45.361789 IP 172.16.99.21.36521 > 172.16.99.15.3128: . ack 1626710396 win 457 <nop,nop,timestamp 1135431 1127109>
        0x0000:  4500 0034 5697 4000 4006 c5e7 ac10 6315  E..4V.@[email protected].
        0x0010:  ac10 630f 8ea9 0c38 668a 05d2 60f5 a17c  ..c....8f...`..|
        0x0020:  8010 01c9 1e6c 0000 0101 080a 0011 5347  .....l........SG
        0x0030:  0011 32c5                                ..2.
17:21:45.407930 IP 172.16.99.21.36521 > 172.16.99.15.3128: P 1720321490:1720321613(123) ack 1626710396 win 457 <nop,nop,timestamp 1135442 1127109>
        0x0000:  4500 00af 5698 4000 4006 c56b ac10 6315  E...V.@[email protected].
        0x0010:  ac10 630f 8ea9 0c38 668a 05d2 60f5 a17c  ..c....8f...`..|
        0x0020:  8018 01c9 1ee7 0000 0101 080a 0011 5352  ..............SR
        0x0030:  0011 32c5 434f 4e4e 4543 5420 6563 686f  ..2.CONNECT.echo
        0x0040:  2e77 6562 736f 636b 6574 2e6f 7267 3a34  .websocket.org:4
        0x0050:  3433 2048 5454 502f 312e 310d 0a48 6f73  43.HTTP/1.1..Hos
        0x0060:  743a 2065 6368 6f2e 7765 6273 6f63 6b65  t:.echo.websocke
        0x0070:  742e 6f72 670d 0a50 726f 7879 2d43 6f6e  t.org..Proxy-Con
        0x0080:  6e65 6374 696f 6e3a 206b 6565 702d 616c  nection:.keep-al
        0x0090:  6976 650d 0a43 6f6e 6e65 6374 696f 6e3a  ive..Connection:
        0x00a0:  206b 6565 702d 616c 6976 650d 0a0d 0a    .keep-alive....
17:21:45.408347 IP 172.16.99.15.3128 > 172.16.99.21.36521: . ack 1720321613 win 114 <nop,nop,timestamp 1127121 1135442>
        0x0000:  4500 0034 93b9 4000 4006 88c5 ac10 630f  E..4..@[email protected].
        0x0010:  ac10 6315 0c38 8ea9 60f5 a17c 668a 064d  ..c..8..`..|f..M
        0x0020:  8010 0072 c795 0000 0101 080a 0011 32d1  ...r..........2.
        0x0030:  0011 5352                                ..SR
17:21:45.423007 IP 172.16.99.15.3128 > 172.16.99.21.36521: P 1626710396:1626710435(39) ack 1720321613 win 114 <nop,nop,timestamp 1127124 1135442>
        0x0000:  4500 005b 93ba 4000 4006 889d ac10 630f  E..[..@[email protected].
        0x0010:  ac10 6315 0c38 8ea9 60f5 a17c 668a 064d  ..c..8..`..|f..M
        0x0020:  8018 0072 bdab 0000 0101 080a 0011 32d4  ...r..........2.
        0x0030:  0011 5352 4854 5450 2f31 2e30 2032 3030  ..SRHTTP/1.0.200
        0x0040:  2043 6f6e 6e65 6374 696f 6e20 6573 7461  .Connection.esta
        0x0050:  626c 6973 6865 640d 0a0d 0a              blished....
17:21:45.423041 IP 172.16.99.21.36521 > 172.16.99.15.3128: . ack 1626710435 win 457 <nop,nop,timestamp 1135446 1127124>
        0x0000:  4500 0034 5699 4000 4006 c5e5 ac10 6315  E..4V.@[email protected].
        0x0010:  ac10 630f 8ea9 0c38 668a 064d 60f5 a1a3  ..c....8f..M`...
        0x0020:  8010 01c9 1e6c 0000 0101 080a 0011 5356  .....l........SV
        0x0030:  0011 32d4                                ..2.
17:22:15.649132 IP 172.16.99.21.36521 > 172.16.99.15.3128: F 1720321613:1720321613(0) ack 1626710435 win 457 <nop,nop,timestamp 1143003 1127124>
        0x0000:  4500 0034 569a 4000 4006 c5e4 ac10 6315  E..4V.@[email protected].
        0x0010:  ac10 630f 8ea9 0c38 668a 064d 60f5 a1a3  ..c....8f..M`...
        0x0020:  8011 01c9 1e6c 0000 0101 080a 0011 70db  .....l........p.
        0x0030:  0011 32d4                                ..2.
17:22:15.650241 IP 172.16.99.15.3128 > 172.16.99.21.36521: F 1626710435:1626710435(0) ack 1720321614 win 114 <nop,nop,timestamp 1134681 1143003>
        0x0000:  4500 0034 93bb 4000 4006 88c3 ac10 630f  E..4..@[email protected].
        0x0010:  ac10 6315 0c38 8ea9 60f5 a1a3 668a 064e  ..c..8..`...f..N
        0x0020:  8011 0072 8c5b 0000 0101 080a 0011 5059  ...r.[........PY
        0x0030:  0011 70db                                ..p.
17:22:15.650255 IP 172.16.99.21.36521 > 172.16.99.15.3128: . ack 1626710436 win 457 <nop,nop,timestamp 1143003 1134681>
        0x0000:  4500 0034 569b 4000 4006 c5e3 ac10 6315  E..4V.@[email protected].
        0x0010:  ac10 630f 8ea9 0c38 668a 064e 60f5 a1a4  ..c....8f..N`...
        0x0020:  8010 01c9 1e6c 0000 0101 080a 0011 70db  .....l........p.
        0x0030:  0011 5059                                ..PY

并不是说代理服务器的Java TLS连接有问题。如果我改为(仍然使用Java 8)https://www.google.com通过代理建立有效的HTTPS连接(例如与),则我看到CONNECT客户端正Connection established在发送相同的消息,而代理又向后发送了同样的消息,但是TLS握手等仍然可以正常进行并且请求/响应正常完成。

坦白说,我对正在发生的事情(或者更确切地说是未发生的事情)感到困惑。

范·欧克尔

如问题所述,我能够100%重现该问题。我使用的是Squid版本3.5.17(Windows 10 64位),这是使用带有“ echo”网络套接字和Java 7的自签名证书的本地Tomcat(但我认为Java 8并没有什么不同)。
当我使用org.glassfish.tyrus.bundles:tyrus-standalone-client:1.11而不是时,一切正常1.12

当我发现以下错误修正时,我决定使用以前的版本:
2015 / Nov / 13:Grizzly传输无法通过HTTP代理(github-commit打开wss连接

版本1.11已于2015年6月发布,而版本1.12已于2015年9月发布,我希望此修补程序版本为1.13(另请参阅pom历史记录)。

问题的解决方案可能与相关(2015 / Aug / 21)。

作为参考,输出为1.12(硬编码超时为30秒,org.glassfish.tyrus.container.grizzly.client.GrizzlyClientContainer.CLIENT_SOCKET_TIMEOUT因此您必须等待一段时间才能出现错误)。

05:07:25.514 [Grizzly(1)SelectorRunner]跟踪ogtcgcGrizzlyClientFilter-handleConnect
使用SSLEngineImpl。
允许不安全的重新协商:false
允许旧的问候消息:true
初始握手是否正确
是安全的重新协商:false
05:07:25.651 [Grizzly(1)]调试ogtcgcGrizzlyClientFilter-handleRead websocket:null content-size = 0标头=
HttpResponsePacket(
  状态= 200
  原因=建立连接
  协议= HTTP / 1.1
  内容长度= -1
  已提交=假
  标头= []
javax.websocket.DeploymentException:与“ wss://127.0.0.1:8443 / wstest / ws / echoAsyncAnnotation”的连接失败。
    在org.glassfish.tyrus.container.grizzly.client.GrizzlyClientSocket._connect(GrizzlyClientSocket.java:398)
    在org.glassfish.tyrus.container.grizzly.client.GrizzlyClientSocket.access $ 000(GrizzlyClientSocket.java:103)
    在org.glassfish.tyrus.container.grizzly.client.GrizzlyClientSocket $ 1.call(GrizzlyClientSocket.java:235)
    在org.glassfish.tyrus.container.grizzly.client.GrizzlyClientSocket $ 1.call(GrizzlyClientSocket.java:231)
    在org.glassfish.tyrus.container.grizzly.client.GrizzlyClientSocket.connect(GrizzlyClientSocket.java:249)
    在org.glassfish.tyrus.container.grizzly.client.GrizzlyClientContainer.openClientSocket(GrizzlyClientContainer.java:95)
    在org.glassfish.tyrus.client.ClientManager $ 3 $ 1.run(ClientManager.java:663)
    在org.glassfish.tyrus.client.ClientManager $ 3.run(ClientManager.java:712)
    在java.util.concurrent.Executors $ RunnableAdapter.call(Executors.java:471)
    在java.util.concurrent.FutureTask.run(FutureTask.java:262)
    在org.glassfish.tyrus.client.ClientManager $ SameThreadExecutorService.execute(ClientManager.java:866)
    在java.util.concurrent.AbstractExecutorService.submit(AbstractExecutorService.java:110)
    在org.glassfish.tyrus.client.ClientManager.connectToServer(ClientManager.java:511)
    在org.glassfish.tyrus.client.ClientManager.connectToServer(ClientManager.java:355)
    在nl.fw.wsclienttest.WsClient.echoDemo(WsClient.java:69)
    在nl.fw.wsclienttest.WsClient.main(WsClient.java:41)

以及我使用的完全不安全的测试客户端的代码:

import java.io.IOException;
import java.net.URI;
import java.security.KeyStore;
import java.security.cert.*;
import java.util.concurrent.*;

import javax.net.ssl.*;
import javax.websocket.*;

import org.glassfish.tyrus.client.*;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.slf4j.bridge.SLF4JBridgeHandler;

public class WsClient {

    static {
        SLF4JBridgeHandler.removeHandlersForRootLogger();
        SLF4JBridgeHandler.install();
    }

    private static final Logger log = LoggerFactory.getLogger(WsClient.class);

    public static void main(String[] args) {

        System.getProperties().put("javax.net.debug", "ssl,handshake,data,sslctx");
        try {
            new WsClient().echoDemo();
            log.info("done");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    // localhost does not work via squid proxy
    String destUri = "wss://127.0.0.1:8443/wstest/ws/echoAsyncAnnotation";
    String proxyUri = "http://localhost:3128";
    volatile Session wsSession = null;

    void echoDemo() throws Exception {

        final ClientEndpointConfig cec = ClientEndpointConfig.Builder.create().build();
        ClientManager client = ClientManager.createClient();
        client.getProperties().put(ClientProperties.PROXY_URI, proxyUri);
        client.getProperties().put(ClientProperties.SHARED_CONTAINER, false);

        SSLContext sslCtx = createAllTrustingContext();
        SslEngineConfigurator sslEngineConfigurator = new SslEngineConfigurator(sslCtx, true, false, false);
        sslEngineConfigurator.setHostVerificationEnabled(false); //skip host verification
        client.getProperties().put(ClientProperties.SSL_ENGINE_CONFIGURATOR, sslEngineConfigurator);
        // time-out is set to 30 seconds for all operations, so handshake timeout does not work ...
        // see org.glassfish.tyrus.container.grizzly.client.GrizzlyClientContainer.CLIENT_SOCKET_TIMEOUT
        client.getProperties().put(ClientProperties.HANDSHAKE_TIMEOUT, 3000);
        final CountDownLatch messageLatch = new CountDownLatch(1);
        client.connectToServer(new Endpoint() {

            @Override
            public void onOpen(final Session session, EndpointConfig config) {
                try {
                    session.addMessageHandler(new MessageHandler.Whole<String>() {

                        @Override
                        public void onMessage(String message) {
                            log.info("Received message: {}", message);
                            wsSession = session;
                            messageLatch.countDown();
                        }
                    });
                    session.getBasicRemote().sendText("Hello world");
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }, cec, new URI(destUri));
        try {
            messageLatch.await(5, TimeUnit.SECONDS);
            if (wsSession != null) {
                wsSession.close();
            }
        } finally {
            client.shutdown();
        }
    }

    public static SSLContext createAllTrustingContext() throws Exception {

        SSLContext ctx = SSLContext.getInstance("TLSv1.2");
        KeyManagerFactory kmf = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());
        kmf.init((KeyStore) null, "changeit".toCharArray());
        ctx.init(kmf.getKeyManagers(), new TrustManager[] { new TrustServerCertAlways() }, null);
        return ctx;
    }

    static class TrustServerCertAlways implements X509TrustManager {

        @Override public void checkClientTrusted(X509Certificate[] arg0, String arg1) throws CertificateException {
            log.debug("Trusting all client certificates.");
        }

        @Override public void checkServerTrusted(X509Certificate[] arg0, String arg1)   throws CertificateException {
            log.debug("Trusting all server certificates.");
        }

        @Override public X509Certificate[] getAcceptedIssuers() {
            log.debug("No accepted issuers.");
            return null;
        }
    }
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

WebSocket 通过 ws 未连接但 wss 是

来自分类Dev

如何使用安全的WebSocket(WSS)?

来自分类Dev

如何使用安全的WebSocket(WSS)?

来自分类Dev

播放框架:安全WebSocket(WSS)

来自分类Dev

在带有Proguard的Android中使用Tyrus Websocket Client

来自分类Dev

Tyrus每个websocket连接使用多少个线程?

来自分类Dev

Tyrus Websocket服务器握手问题?

来自分类Dev

WSS/TLS websocket connection with Swift iOS

来自分类Dev

WSS / TLS WebSocket与Swift iOS的连接

来自分类Dev

无法在Android中将WebSocket与WSS连接

来自分类Dev

Websocket握手。从ws到wss

来自分类Dev

Tyrus Websocket客户端@OnMessage从未调用-Storj开源项目

来自分类Dev

是否可以使用SSL运行独立的Tyrus Websocket服务器?

来自分类Dev

集群Websockets Tyrus Java

来自分类Dev

WebSocket握手期间出错:位置不匹配:wss:// *!= ws:// *

来自分类Dev

使用wss(websocket)格式化以发送和接收数据

来自分类Dev

变量不通过?

来自分类Dev

当通过HTTP路由到后端时,Nginx Ingress如何处理通过HTTPS(wss:...)的传入WebSocket连接?(ws:...)?

来自分类Dev

如何在ws和wss彼此通信或同步数据的同时运行websocket服务器?还是HTTP上的WSS和HTTPS上的WS?

来自分类Dev

如何在Linux上将安全websocket(wss://)隧道到不安全的websocket(ws://)(stunnel?)

来自分类Dev

如何为Wildfly服务器内的Websocket创建独立的tyrus客户端,以在两个Wildfly实例之间进行通信

来自分类Dev

最小的Java8 Nio安全Websocket客户端(wss)

来自分类Dev

Websocket-WSS在视频记录中的HTTPS上不起作用

来自分类Dev

使用Django和Node.js为Websocket设置Nginx的配置(wss://)

来自分类Dev

当以wss安全模式运行时,Chrome中的Websocket性能明显较差

来自分类Dev

有没有可用的安全websocket(wss协议)客户端浏览器插件?

来自分类Dev

RoR 5.0.0 ActionCable wss WebSocket握手:意外的响应代码:301

来自分类Dev

节点wss Websocket在台式机上工作,而不在移动设备上工作

来自分类Dev

我可以将WebSocket从ws更改为wss吗?(000webhost)

Related 相关文章

  1. 1

    WebSocket 通过 ws 未连接但 wss 是

  2. 2

    如何使用安全的WebSocket(WSS)?

  3. 3

    如何使用安全的WebSocket(WSS)?

  4. 4

    播放框架:安全WebSocket(WSS)

  5. 5

    在带有Proguard的Android中使用Tyrus Websocket Client

  6. 6

    Tyrus每个websocket连接使用多少个线程?

  7. 7

    Tyrus Websocket服务器握手问题?

  8. 8

    WSS/TLS websocket connection with Swift iOS

  9. 9

    WSS / TLS WebSocket与Swift iOS的连接

  10. 10

    无法在Android中将WebSocket与WSS连接

  11. 11

    Websocket握手。从ws到wss

  12. 12

    Tyrus Websocket客户端@OnMessage从未调用-Storj开源项目

  13. 13

    是否可以使用SSL运行独立的Tyrus Websocket服务器?

  14. 14

    集群Websockets Tyrus Java

  15. 15

    WebSocket握手期间出错:位置不匹配:wss:// *!= ws:// *

  16. 16

    使用wss(websocket)格式化以发送和接收数据

  17. 17

    变量不通过?

  18. 18

    当通过HTTP路由到后端时,Nginx Ingress如何处理通过HTTPS(wss:...)的传入WebSocket连接?(ws:...)?

  19. 19

    如何在ws和wss彼此通信或同步数据的同时运行websocket服务器?还是HTTP上的WSS和HTTPS上的WS?

  20. 20

    如何在Linux上将安全websocket(wss://)隧道到不安全的websocket(ws://)(stunnel?)

  21. 21

    如何为Wildfly服务器内的Websocket创建独立的tyrus客户端,以在两个Wildfly实例之间进行通信

  22. 22

    最小的Java8 Nio安全Websocket客户端(wss)

  23. 23

    Websocket-WSS在视频记录中的HTTPS上不起作用

  24. 24

    使用Django和Node.js为Websocket设置Nginx的配置(wss://)

  25. 25

    当以wss安全模式运行时,Chrome中的Websocket性能明显较差

  26. 26

    有没有可用的安全websocket(wss协议)客户端浏览器插件?

  27. 27

    RoR 5.0.0 ActionCable wss WebSocket握手:意外的响应代码:301

  28. 28

    节点wss Websocket在台式机上工作,而不在移动设备上工作

  29. 29

    我可以将WebSocket从ws更改为wss吗?(000webhost)

热门标签

归档