首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >TLS Websocket转发未按预期工作

TLS Websocket转发未按预期工作
EN

Stack Overflow用户
提问于 2018-01-14 21:27:51
回答 1查看 233关注 0票数 0

我有一个可以工作的websocket,它可以从我的客户端代码中访问,如下所示:(不使用Socket.io或任何库,只使用普通的html5 websocket)

代码语言:javascript
复制
ws://localhost:9000/socket/connect

Websocket在Java Play框架中的实现

代码语言:javascript
复制
public WebSocket connect() {
    return WebSocket.Text.accept(request -> ActorFlow.actorRef(out -> SocketActor.props(out, jsonWebToken),
            actorSystem, materializer
    )
    );
}

无论如何,这是工作得很好,但我现在想为网站设置https,并在nginx上做这件事。切换到https我还需要使用wss协议而不是ws,因此我也想通过nginx代理wss调用,因此我面临着问题。

我已经为websocket代理配置了我的nginx,如这里所述,https://www.nginx.com/blog/websocket-nginx/我的完整配置如下所示

代码语言:javascript
复制
upstream backend {
        server backend:9000;
}

server {
        listen 80;
        server_name _;
        return 301 https://$host$request_uri;
}

server {
        listen 443 ssl;
        server_name legato;
        ssl_certificate /etc/nginx/ssl/legato.crt;
        ssl_certificate_key /etc/nginx/ssl/legato.key;

        location /api {
                return 302 /api/;
        }
        location /api/ {
                proxy_pass http://backend/;
        }
        location /statics {
                root /var/www;
        }
        location /socket/connect {
                proxy_pass http://backend/;
                proxy_http_version 1.1;
                proxy_set_header Upgrade $http_upgrade;
                proxy_set_header Connection $connection_upgrade;
        }
        location / {
            root /var/www/frontend;
            index index.html;

            try_files $uri /index.html;
        }
}

因此,/socket/connect路由被转发到websocket后端路由。

在我的客户端javascript代码中,我现在像这样打开websocket。

代码语言:javascript
复制
socket = new WebSocket(wss://192.168.155.177/socket/connect);

这给了我一个错误

代码语言:javascript
复制
WebSocket connection to 'wss://192.168.155.177/socket/connect' failed: Error during WebSocket handshake: Unexpected response code: 200

有人能给我解释一下这种情况下哪里出了问题吗?

EN

回答 1

Stack Overflow用户

发布于 2018-01-16 19:31:05

我为这个问题找到了一个小的解决方法,我打算把它留给将来的任何人。

所以我试着:

  • 为NGINX上的Websockets实现SSL加密。这不起作用,因为NGINX会再次通过http连接到websocket。因为我没有使用任何socket.io,这没有工作,因为后端不支持它
  • 在后端实现SSL。这对我来说是相当棘手的。在java上切换到https需要使用密钥库,而且How to use TLS in Play!Framework WebSockets ("wss://")建议即使我可以让https工作,wss也可能不能工作。因此,在几次失败的尝试之后,我放弃了这一点。

这个解决方案是使用stunnel,它允许我打开一个端口,加密任何传入的流量,并将其转发到另一个端口。因此,我现在使用ssl对端口9433上的流量进行加密,并将其转发到后端(未解密的ws Endpoint ),从而使其正常工作。

如果你不想在实际的生产环境中使用它,你应该对这种方法的可扩展性进行一些研究,特别是对stunnel。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48250064

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档