是否可以通过TLS通过NGINX中继WebSocket?

时间:2017-08-21 16:56:39

标签: node.js nginx nginx-reverse-proxy

可以这样:

  • 充当WebSocket客户端的节点JS服务器

  • 处理WebSocket流量的NGINX

  • JVM套接字服务器

通过TLS工作?

1 个答案:

答案 0 :(得分:2)

当然,我可以想象两种方法来设置它:

  1. 将TLS添加到Nginx
  2. 将TLS添加到原始Websocket服务器(在您的情况下为JVM)
  3. 第二种方法有更多的优点,因为它也保证了Nginx和Websocket之间的连接(想象你想在两个不同的容器/机器中托管它们)

    想象一下这样的图表是第一种方法:

    Nodejs Socket Client <--Secure--> Nginx <--NOT Secure--> JVM
    

    以及第二种方法的类似内容:

    Nodejs Socket Client <--Secure--> Nginx <--Secure--> JVM
    

    我在此处创建了一个公共存储库,演示了如何设置第一种方法:https://github.com/afshinm/websocket_tls_docker

    在服务器端设置TLS

    如果你想采用第二种方法,它会因框架而异。您需要阅读文档。但请记住,Nginx可以解密和加密您的流量,因此在这种情况下您需要做的就是将proxy_pass的值更改为https://...前缀,以便Nginx知道首先解密流量。

    但是对于第一种方法,只需在server配置中添加以下设置即可启用TLS:

    ssl on;
    ssl_certificate /path/ssl-bundle.crt;
    ssl_certificate_key /path/myserver.key;
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    

    不要忘记将这些内容添加到serverlocation块中(根据您的配置):

    proxy_pass ​http://your_jvm_backend_host;
    proxy_http_version 1.1;
    proxy_set_header Connection "upgrade";
    proxy_set_header Upgrade $http_upgrade;
    proxy_read_timeout 86400;
    

    现在,您从Nginx到您的客户的连接是安全的(wss://...)。

    设置客户端

    假设您正在使用ws包,您可以像这样连接到安全的Websocket连接:

    const WebSocket = require('ws');
    
    const ws = new WebSocket('wss://your_backend');
    
    ws.on('open', function open() {
      ws.send('Hola!');
    });
    

    就是这样。