是否可以通过 TLS 通过 NGINX 中继 WebSocket?
Is it possible to relay a WebSocket through NGINX over TLS?
可以这样吗:
作为WebSocket客户端的node JS服务器
处理 WebSocket 流量的 NGINX
JVM 套接字服务器
在 TLS 上工作?
当然,我可以想象两种设置方法:
- 将 TLS 添加到 Nginx
- 将 TLS 添加到原始 Websocket 服务器(在您的情况下为 JVM)
第二种方法有更多优势,因为它也保护了 Nginx 和 Websocket 之间的连接(假设您想将它们托管在两个不同的容器/机器中)
想象一下第一种方法的图表:
Nodejs Socket Client <--Secure--> Nginx <--NOT Secure--> JVM
第二种方法类似这样:
Nodejs Socket Client <--Secure--> Nginx <--Secure--> JVM
我在这里创建了一个 public 存储库,它演示了如何设置第一种方法: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;
并且不要忘记将这些添加到您的 server
或 location
块(根据您的配置):
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!');
});
就是这样。
可以这样吗:
作为WebSocket客户端的node JS服务器
处理 WebSocket 流量的 NGINX
JVM 套接字服务器
在 TLS 上工作?
当然,我可以想象两种设置方法:
- 将 TLS 添加到 Nginx
- 将 TLS 添加到原始 Websocket 服务器(在您的情况下为 JVM)
第二种方法有更多优势,因为它也保护了 Nginx 和 Websocket 之间的连接(假设您想将它们托管在两个不同的容器/机器中)
想象一下第一种方法的图表:
Nodejs Socket Client <--Secure--> Nginx <--NOT Secure--> JVM
第二种方法类似这样:
Nodejs Socket Client <--Secure--> Nginx <--Secure--> JVM
我在这里创建了一个 public 存储库,它演示了如何设置第一种方法: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;
并且不要忘记将这些添加到您的 server
或 location
块(根据您的配置):
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!');
});
就是这样。