繁体   English   中英

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

[英]Is it possible to relay a WebSocket through NGINX over TLS?

可以这样:

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

  • NGINX处理WebSocket流量

  • JVM套接字服务器

通过TLS工作?

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

  1. 将TLS添加到Nginx
  2. 将TLS添加到原始Websocket服务器(在您的情况下为JVM)

第二种方法具有更多优势,因为它还可以确保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!');
});

而已。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM